...
recoverInnerSpaceCompaction(isSeq)方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程SizeTieredCompactionRecoverTask,并异步执行恢复流程。,并同步执行恢复流程。
2)跨空间合并恢复
InitCompactionrecoverCrossSpaceCompaction()方法:往合并任务管理器CompactionTaskManager的执行线程池taskExecutionPool里提交一个跨空间合并恢复线程CompactionRecoverTask并异步执行,执行完后就会回调submitTimedCompactionTask()方法以定时执行合并任务。方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程RewriteCrossCompactionRecoverTask,并同步执行恢复流程。
合并任务的定时执行
当server启动后,每个虚拟存储组首先会执行顺序空间和乱序空间内的合并恢复和跨空间的合并恢复,执行完后就会回调submitTimedCompactionTask()方法以定时执行合并任务,具体操作如下:
...
- 选择待合并的源文件,并设置setCompactionCandidate(true),将它们封装入一个合并任务里,并放入等待队列中。
- 从等待队列里拿出来,依次对每个源文件加读锁,并检查该源文件是否Valid,若isValid则setCompacting(true),否则释放所有源文件的读锁并setCompacting(false)
- 执行合并,并将临时目标文件移动成最终目标.tsfile文件,生成.resource文件,合并compactionMods文件,更新内存:
- 给TsFileManager加写锁
- 更新 TsFileResourceManager,使用Sychronized移除源文件的 TsFileResource 并增加目标文件的 TsFileResource
- 更新TsFileManager的TsFileResourceList:TsFileResourceList,移除源文件的tsfileResource,插入目标文件的tsFileResource
- 对tsFileManager加读锁,移除源文件的tsfileResource,释放读锁 对tsFileResourceList加写锁,插入目标文件的tsFileResource,给TsFileManager释放写锁
...