THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
合并任务的执行流程
- 为每个待合并源文件加读锁,并set IsCompacting为true
- 创建临时的目标文件列表,为 .cross 文件
- 创建合并日志,为 .compaction.log 文件
- 调用CompactionUtils工具的compact接口,执行具体的跨空间合并。
- 将临时目标文件 .cross文件重命名为 .tsfile 文件,并序列化目标文件的 resource 文件,即 .tsfile.resource 文件
- 将合并过程中对所有待合并源文件产生的 .compaction.mods 文件里的删除操作合并到目标文件的 .mods 文件里
- 更新相关内存:
- 给TsFileManager加写锁
- 更新 TsFileResourceManager,移除源文件的 TsFileResource 并增加目标文件的 TsFileResource
- 更新TsFileResourceList,移除 TsFileResourceList 里源文件的 TsFileResource,并在相同位置增加目标文件的 TsFileResource
- 给TsFileManager释放写锁
- 给每个源文件释放读锁,并加写锁
- 删除本地源文件和对应的.resource文件
- 删除源文件对应的本地.mods文件和.compaction.mods文件
- 删除合并日志
- 给每个源文件释放写锁,并set isCompacting为false,isCompactionCandidate为false
CompactionUtils工具
该工具可用于空间内和跨空间的合并,而目前对于顺序空间内合并我们使用的是InnerSpaceCompactionUtils以加速合并。
Compact接口
流程:
- 注册queryId,其中queryID=Long.Min+合并线程号
- 根据合并类型构建对应的CompactionWriter(CrossSpaceCompactionWriter或InnerSpaceCompactionWriter)
- 使用迭代器 迭代地获取所有源文件里的deviceid,对每个设备获取其所有的measurements:
- 对每个序列构建SeriesRawBatchReader,依次读出整理(排序且去重)后的每个数据点并写入目标文件中
注意:
- 跨空间合并中,写入目标文件的每个设备的数据点的时间戳不大于对应源文件的deviceMaxEndTime.
- 若乱序文件里有新数据(即乱序文件里出现顺序文件里没有的device,后者乱序序列的时间大于顺序文件里的最大时间的数据点),则往最后一个目标文件里写
- 若合并后,某个源文件对应的mods把其数据都删掉了,则该源文件的targetFileResource会从接口的targetResource列表中移