目的:将没有与任何顺序文件发生重叠的乱序文件填充到顺序空间中
碎文件清理任务提交
碎文件清理任务使用独立的线程池(不与空间内以及跨文件空间合并使用同一个线程池),在后台开启一个独立的线程进行定时提交。
碎文件清理任务选择流程
- 从新到老遍历顺序文件列表 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
- if UF.size() > 0
- UF.add(u)
- if u 未关闭 || u 正在合并
- if u.startTime() > s.endTime()
- if UF.size() > 0
- 提交一个碎片清理任务,UF = []
- 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
- if s 是最后一个文件
- 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
- if u.endTime() < s.startTime()
- if u 未关闭 || u 正在合并
- if UF.size() > 0
- 提交一个碎文件清理任务,UF=[]
- break
- if UF.size() > 0
- UF.add(u)
- if u 未关闭 || u 正在合并
- if u.endTime() < s.startTime()
- if UF.size() > 0
- 提交一个碎片清理任务,UF = []
- break
- 按照文件版本从老到新遍历乱序文件 for u in unseqFiles:
- 找到 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
- if UF.size() > 0
- UF.add(u)
- if u 未关闭 || u 正在合并
- if u.startTime >= nextS.endTime && u.endTime < s.startTime
- 如果 UF.size() > 0
- 提交一个碎文件清理任务,UF=[]
- s 正在合并:
非碎片重叠文件直接移动
场景
在将乱序文件嵌入到顺序文件列表时,存在这样的情况,一些乱序文件既没有与别的乱序文件重叠,也没有和顺序文件重叠,同时大小也比较合适,那么这时候就可以将这些乱序文件直接插到顺序文件列表中
例如在上图中,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
- if fileCluster 中仅有的这个文件大小 > cross_space_fragment_file_target_size
- else
- 将 fileCluster 中的 unseqFile 合并到一个临时文件中(如果有未关闭的临时文件,则放到未关闭的临时文件中;否则新建一个临时文件),然后将该临时文件经过重命名后(规则与前面 if 语句中的重命名过程相同)移动到顺序文件列表中
- if fileCluster.size() == 1