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

Compare with Current View Page History

« Previous Version 6 Next »

目的:将没有与任何顺序文件发生重叠的乱序文件填充到顺序空间中

碎文件清理任务提交

碎文件清理任务使用独立的线程池(不与空间内以及跨文件空间合并使用同一个线程池),在后台开启一个独立的线程进行定时提交。

碎文件清理任务选择流程

  • 从新到老遍历顺序文件列表 for s in seqFiles
    • s 正在合并:
      • continue
    • if s 是第一个文件
      • 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
        • if u.startTime() > s.endTime()
          • if u 未关闭 || u 正在合并
            • if UF.size() > 0
              • 提交一个碎文件清理任务,UF=[]
            • break
          • UF.add(u)
      • if UF.size() > 0
        • 提交一个碎片清理任务,UF = []
    • if s 是最后一个文件
      • 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
        • if u.endTime() < s.startTime()
          • if u 未关闭 || u 正在合并
            • if UF.size() > 0
              • 提交一个碎文件清理任务,UF=[]
            • break
          • UF.add(u)
      • if UF.size() > 0
        • 提交一个碎片清理任务,UF = []
      • break
    • 找到 s 的下一个文件 nextS
    • UF = []
    • 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
      • if u.startTime >= nextS.endTime && u.endTime  < s.startTime
        • if u 未关闭 || u 正在合并
          • if UF.size() > 0
            • 提交一个碎文件清理任务,UF=[]
          • break
        • UF.add(u)
    • 如果 UF.size() > 0
      • 提交一个碎文件清理任务,UF=[]

非碎片重叠文件直接移动

场景

在将乱序文件嵌入到顺序文件列表时,存在这样的情况,一些乱序文件既没有与别的乱序文件重叠,也没有和顺序文件重叠,同时大小也比较合适,那么这时候就可以将这些乱序文件直接插到顺序文件列表中

例如在上图中,4号乱序文件和5号乱序文件既没有和顺序文件发生重叠,也没有和任何乱序文件发生重叠,那么就可以直接将它们经过重命名后移动到顺序文件空间中;3号乱序文件和6号乱序文件之间发生了重叠,需要将其进行合并后生成一个新文件插入到顺序文件空间中;7 号文件没有和顺序文件以及乱序文件产生重叠,也可以在重命名后移动到顺序文件空间中。


碎文件清理任务执行

输入:顺序文件 firstSeqFile, secondSeqFile,选中的乱序文件列表 selectedUnseqFileList

要求

  • (firstSeqFile == null && secondSeqFile != null) || (firstSeqFile != null && secondSeqFile == null ) || (firstSeqFile != null && secondSeqFile != null) 
  • unseqFileList 中的文件版本号依次底层,且全局的乱序文件列表中不存在与 selectedUnseqFileList 中的文件重叠且版本号更小的乱序文件。
  • 当 firstSeqFile != null 且 secondSeqFile == null 时,要求 selectedUnseqFileList 中的所有文件的 startTime 都大于 firstSeqFile 的 endTime
  • 当 firstSeqFile == null 且 secondSeqFile != null 时,要求 selectedUnseqFileList 中的所有文件的 endTime 都小于 secondSeqFile 的 startTime
  • 当 firstSeqFile 和 secondSeqFile 都不为空时,firstSeqFile.startTime > secondSeqFile.endTime,且对于 selectedUnseqFileList 中的任意一个乱序文件 u, firstSeqFile.startTime > u.endTime > u.startTime > secondSeqFile.endTime

执行

  • 获取 UnseqTsFileList 中的所有设备和传感器 deviceSensorsMap(Map<Device, List<Sensor>>)
  • 将文件根据重叠情况整理成簇List<List<TsFileResource>> unseqFileClusters
  • for fileCluster in unseqFileCluster
    • if fileCluster.size() == 1
      • if fileCluster 中仅有的这个文件大小 > cross_space_fragment_file_target_size 
        • 将 fileCluster 中的这个 unseqFile 的名字改成  (后一个顺序文件的时间戳-1)-(后一个顺序文件的版本号)-0-1.tsfile
        • 如果存在同名文件,则改成(后一个顺序文件的时间戳-1)-(系统最新版本号)-0-1.tsfile,同时更新系统最新版本号
      • else
        • 将该文件的内容写到一个临时的文件中,不关闭该文件
      • continue
    • else
      • 将 fileCluster 中的 unseqFile 合并到一个临时文件中(如果有未关闭的临时文件,则放到未关闭的临时文件中;否则新建一个临时文件),然后将该临时文件经过重命名后(规则与前面 if 语句中的重命名过程相同)移动到顺序文件列表中




  • No labels