You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

合并任务的执行流程

  1. 为每个待合并源文件加读锁并set IsCompacting为true
  2. 创建临时的目标文件列表,为 .cross 文件
  3. 创建合并日志,为 .compaction.log 文件
  4. 调用CompactionUtils工具的compact接口,执行具体的跨空间合并。
  5. 将临时目标文件 .cross文件重命名为 .tsfile 文件,并序列化目标文件的 resource 文件,即 .tsfile.resource 文件
  6. 更新相关内存:
    1. 更新 TsFileResourceManager,移除源文件的 TsFileResource 并增加目标文件的 TsFileResource
    2. 更新 TsFileManager,移除 TsFileResourceList 里源文件的 TsFileResource,并在相同位置增加目标文件的 TsFileResource
  7. 给每个源文件释放读锁,并加写锁
  8. 合并过程中对所有待合并源文件产生的 .compaction.mods 文件里的删除操作合并到目标文件的 .mods 文件里
  9. 删除本地源文件和对应的.resource文件
  10. 删除源文件对应的本地.mods文件和.compaction.mods文件
  11. 删除合并日志
  12. 给每个源文件释放写锁,并set isCompacting为false,isCompactionCandidate为false


CompactionUtils工具

该工具可用于空间内和跨空间的合并,而目前对于顺序空间内合并我们使用的是InnerSpaceCompactionUtils以加速合并。

Compact接口

流程:

  1. 注册queryId,其中queryID=Long.Min+合并线程号
  2. 根据合并类型构建对应的CompactionWriter(CrossSpaceCompactionWriter或InnerSpaceCompactionWriter)
  3. 使用迭代器 迭代地获取所有源文件里的deviceid,对每个设备获取其所有的measurements:
  4. 对每个序列构建SeriesRawBatchReader,依次读出整理(排序且去重)后的每个数据点并写入目标文件中

注意:

  1. 跨空间合并中,写入目标文件的每个设备的数据点的时间戳不大于对应源文件的deviceMaxEndTime.
  2. 若乱序文件里有新数据(即乱序文件里出现顺序文件里没有的device,后者乱序序列的时间大于顺序文件里的最大时间的数据点),则往最后一个目标文件里写
  3. 若合并后,某个源文件对应的mods把其数据都删掉了,则该源文件的targetFileResource会从接口的targetResource列表中移


  • No labels