THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
问题与目标
TsFile中的Version是一个递增的Long类型字段,由VersionController生成并在每个memtable被写入到磁盘时被序列化,主要用于标记每个memtable中chunk的写入次序。 这个version字段目前主要用于以下两方面:
...
- Mods文件中记录的delete信息中versionNum被替换为tsFileOffset,用于表示delete对于相应的Tsfile文件生效的文件位置,如果TsFile中一个chunk的offset小于等于tsFileOffset,则表示delete对这个chunk生效。
- 每个chunk记录所属tsFileResource的version,即resource文件命名中的version。对于多个chunk内时间戳相同的数据点,首先比较这个所属tsFileResource的version,如相同,再比较多个chunk的offset,以确定chunk之间的更新次序。
Delete流程修改
1.删除working memory table中的数据
working memory table存在于内存中,在delete语句执行过程中可以直接删除满足条件的数据。该情况与version无关,因此无需更改。
...
对于已存在于tsfile中的数据,查询时会以chunkmetadata的形式被load到内存中。查询这些chunkmetadata时从mods文件中提取删除记录即可。
Query流程修改
- 修改modifyChunkMetaData(),将应用Deletion修改的条件改为比较Deletion的offset和chunkMetadata的offset。
- 查询过程中将每个tsFile的命名version记录到TsfileResource中,在deletion被写入到mods文件时用这个version更新deletion记录。在SeriesReader中使用{ tsFileVersion, offset }作为代替version的metric,用于merge reader的中排序。
- Last查询需要获取每个序列的最新数据点时,比较多个chunk中的最大时间戳。如果出现最大时间戳相等的情况,则首先比较chunk所属的tsFile的文件version,再比较chunk的offset,最新数据点取offset更大的chunk数据。
Recover流程修改
重启后Recover流程需要关注对于flushingMemtable的处理。如果有flushingMemtable的情况下重启server,会导致该flushingMemtable对应的TsfileResource处于crashed状态,需要通过WAL进行恢复。
...