THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
- 获取 SeqTsFileList和UnseqTsFileList 中的所有设备和传感器 deviceSensorsMap(Map<Device, List<Sensor>>)
- 新建一个 Map<TsFileResource, RestorableFileWriter> newWriterCache;
- 新建一个 Map<TsFileResource, TsFileResource> newTsFileResourceCache;
- for device, sensors in deviceSensorsMap
- 为 sensors 构建一个 bitMap,记录是否被合并,默认全部为 false
- for seqFile in SeqTsFileList
- 从 newTsFileResourceCache 中获取,若不存在则新建一个 TsFileResource writer
- 从 newWriterCache 中获取,若不存在则新建一个 RestorableFileWriter writer
- writer.startChunkGroup(device)
- 对于 seqFile 新建 ChunkMetadataListIterator
- 从 ChunkMetadataListIterator 中迭代获取该设备的 sensorList 及其对应的 List<ChunkMetadata> sensorChunkMetadataList(每次返回 max_degree_of_index_node 个 sensor),对于每一个迭代,并获取 ModificationList,对于每一个迭代
- for sensor, sensorChunkMetadataList:
- 如果 sensorChunkMetadataList 不为空
- 根据 算法1 将该 sensor 的 Chunk 与对应的 unseqReader 中的数据进行合并
- 将该 sensor 在 bitMap 上的位置为 true
- 如果 sensorChunkMetadataList 不为空
- for sensor, sensorChunkMetadataList:
- 如果当前的 seqFile 是最后一个 seqFile:
- 将该 device 下在 bitMap 中记录未合并的 sensor 对应的 unseqReader 的数据写入这个 seqFile 的临时文件中
- for unseqReader in unseqReaderList
- if unseqReader 未读完
- 新建一个 ChunkWriter
- 根据 算法3 将未读完的 unseqReader 的剩余数据写入 ChunkWriter 中
- 将 ChunkWriter 写入到writer
- if unseqReader 未读完
- writer.endChunkGroup()
- for tsFileResource in newTsFileResourceCache
- tsFileResource.serialize()
- tsFileResource.close()
- for writer in newWriterCache
- writer.endFile()
...
输入:sensor, sensorChunkMetadataList, unseqReader, tsFileResource, modification
- for chunkMetadata in sensorChunkMetadataList
- chunk = readMemChunk(chunkMetadata)
- unclosedChunkPoint = 0L
- tsFileResource.updateStartTime(chunkMetadata.startTime)
- tsFileResource.updateEndTime(chunkMetadata.endTime)
- 判断当前 chunk 是否被修改 modified
- if isOverlap(chunkMetadata)
- 将其与乱序数据重叠的部分合并后写入 ChunkWriter(见 算法2)
- unclosedChunkPoint+=写入的点数
- else if isChunkTooSmall(chunkMetadata)
- 将这个 Chunk 解压缩后写入 ChunkWriter
- unclosedChunkPoint+=写入的点数
- else
- if unclosedChunkPoint > 0 || modified
- 将这个 Chunk 解压缩后写入 ChunkWriter
- else
- 将这个 Chunk 不解压缩写入 writer
- if unclosedChunkPoint > 0 || modified
- if unclosedChunkPoint > merge_chunk_point_num_threshold
- 将 ChunkWriter 写入 writer
- unclosedChunkPoint = 0
...
- 对 Chunk 构建一个 ChunkReader
- 使用 ChunkReader 获取 Chunk 中的每一个 Page
- while pageData.hasNext()
- 获取 pageData 当前的时间戳 seqTime
- overwriteSeqPoint = false
- while 该 sensor 还有乱序数据并且乱序数据的下一个时间戳小于 seqTime
- 将乱序数据写入 ChunkWrtier 中
- tsFileResource.updateStartTime(乱序数据)
- tsFileResource.updateEndTime(乱序数据)
- 如果乱序数据的时间戳 == seqTime
- overwriteSeqPoint = true
- 根据 算法3 将该 unseqReader 小于等于 deviceEndTime 的剩余数据写入 ChunkWriter 中
- if !overwriteSeqPoint && !pageData 当前时间戳在 modification 中被删除
- 将 pageData 当前的数据点写入 ChunkWriter 中
- tsFileResource.updateStartTime(乱序数据)
- tsFileResource.updateEndTime(乱序数据)
- while pageData.hasNext()
...