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

Compare with Current View Page History

« Previous Version 5 Next »

合并任务的执行流程

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