Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

2. 目标:(1)总体:目前tsfile采用一对一的索引方式,每个tsfile都有一个索引文件TsFileResource。由于TsFileResource常驻内存中,当有过多设备的情况下,就会报内存。TsFileResource,tsfile文件内的信息(开始时间、结束时间等)都保存在TsFileResource中。

由于TsFileResource常驻内存中,当有过多设备的情况下,就会爆内存。本次针对本次针对TsFileResouce的改进总目标为可以支持更多的设备。

...

具体而言,涉及到数据结构如下:

1. FileIndexEntries:(用于信息传递)

private TimeIndexEntry[] indexEntries; // TimeIndexEntry 列表,记录文件中所有的前缀路径、开始时间和结束时间

private String tsFilePath; // TsFile 路径

2. TimeIndexEntry:

private PartialPath path; // 前缀路径

private long startTime; // 开始时间

private long endTime; // 结束时间


第一步接口化(本次)的修改中,可以从TsFileResource中转移走的字段:

...

【TsFileResource文件句柄保留的功能和字段】

Map<String, String> cachedDevicePool

File file // tsfile

TsFileProcessor processor

ModificationFile modFile

boolean closed

boolean deleted

boolean isMerging

Set<Long> historicalVersions

TsFileLock tsFileLock

List<ChunkMetadata> chunkMetadataList

List<ReadOnlyMemChunk> readOnlyMemChunk

TimeseriesMetadata timeSeriesMetadata

List<TsFileResource> upgradedResources

UpgradeTsFileResourceCallBack upgradeTsFileResourceCallBack

boolean isSeq

TsFileResource originTsFileResource

long maxPlanIndex // for cluster, max index of plans executed within this TsFile

long minPlanIndex // for cluster, min index of plans executed within this TsFile

三、涉及到使用文件索引的操作

【数据的插入和批量插入】

...

(1) 如果是乱序文件,则更新tsfileResource中的endTimeMap (deviceToIndex, endTimes)

(2) 如果tsfile中没有该设备的信息,或新插入数据的时间小于已存startTime,则更新tsfileResource中的startTimeMap

4. 记录写前日志

5. 根据 memtable 大小,来判断是否触发异步持久化 memtable 操作。如果是顺序文件且执行了刷盘动作,则更新tsfileResource中的endTimeMap

6. 根据当前磁盘 TsFile 的大小,判断是否触发文件关闭操作


修改:第3步将endTimeMap、startTimeMap存储在TsFileProcessor中,而不是tsfileResource中


【数据的访问】

总入口StorageEngine: public QueryDataSource query(SingleSeriesExpression seriesExpression, QueryContext context, QueryFileManager filePathsManager)

需修改找到所有包含这个时间序列的顺序和乱序的TsFileResource (文件索引)进行返回,供查询引擎使用


修改:调用filterByPath(path, timeFilter) 方法


【重启恢复流程】

StorageGroupProcessorrecover()

...

若该 TsFile 是此分区的最后一个,且未封口,则还要为其构造TsFileProcessor对象,并加入work(Un)sequenceTsFileProcessors中

(1)若该 2. 若该 TsFile 文件不是最后一个文件,或者该 TsFile 文件是最后一个文件,但已经被关闭或标记被关闭,

只需将该 TsFile 文件在内存中对应的TsFileResource(文件句柄)的closed属性置成true即可。

(2)若该 3. 若该 TsFile 文件可以继续写入,则表示这是此分区的最后一个 TsFile,且未封口,则继续保持其未封口的状态,

需要为它构造一个TsFileProcessor对象,并将其放到workSequenceTsFileProcessors或workUnsequenceTsFileProcessors中。

(3)最后将恢复出来的 4. 最后将恢复出来的 TsFile 文件在内存中对应的TsFileResource(文件句柄+文件索引)对象放入sequenceFileTreeSet或unSequenceFileList中,用于更新分区对应的版本号等

...