Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

recoverInnerSpaceCompaction(isSeq)方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程SizeTieredCompactionRecoverTask,并异步执行恢复流程。,并同步执行恢复流程。

2)跨空间合并恢复

        InitCompactionrecoverCrossSpaceCompaction()方法:往合并任务管理器CompactionTaskManager的执行线程池taskExecutionPool里提交一个跨空间合并恢复线程CompactionRecoverTask并异步执行,执行完后就会回调submitTimedCompactionTask()方法以定时执行合并任务。方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程RewriteCrossCompactionRecoverTask,并同步执行恢复流程。


合并任务的定时执行

当server启动后,每个虚拟存储组首先会执行顺序空间和乱序空间内的合并恢复和跨空间的合并恢复,执行完后就会回调submitTimedCompactionTask()方法以定时执行合并任务,具体操作如下:

(1) 从该虚拟存储组下的每个时间分区里依次使用合并任务调度器CompactionSchedule根据合并策略去选择一批批待合并文件,并为每批文件创建一个合并任务线程放进CompactionTaskManager里的线程等待队列里

(2) 从等待队列里获取一个合并线程并执行

合并的加锁流程

  1. 选择待合并的源文件,并设置setCompactionCandidate(true),将它们封装入一个合并任务里,并放入等待队列中。
  2. 从等待队列里拿出来,依次对每个源文件加读锁,并检查该源文件是否Valid,若isValidsetCompacting(true),否则释放所有源文件的读锁并setCompacting(false)
  3. 执行合并,并将临时目标文件移动成最终目标.tsfile文件,生成.resource文件,合并compactionMods文件,更新内存:
    1. 给TsFileManager加写锁
    2. 更新 TsFileResourceManager,使用Sychronized移除源文件的 TsFileResource 并增加目标文件的 TsFileResource
    3. 更新TsFileManagerTsFileResourceList,移除源文件的tsfileResource,插入目标文件的tsFileResource
    4. 给TsFileManager释放写锁
  4. 依次对每个源文件释放读锁加写锁,删除源文件和日志。
  5. 对每个源文件释放写锁setCompacting(false)setCompactionCandidate(false).