Versions Compared

Key

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

问题与目标

TsFile中的Version是一个递增的Long类型字段,由VersionController生成并在每个memtable被写入到磁盘时被序列化,主要用于标记每个memtable中chunk的写入次序。 这个version字段目前主要用于以下两方面:

...

  1. Mods文件中记录的delete信息中versionNum被替换为tsFileOffset,用于表示delete对于相应的Tsfile文件生效的文件位置,如果TsFile中一个chunk的offset小于等于tsFileOffset,则表示delete对这个chunk生效。
  2. 每个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流程修改

  1. 修改modifyChunkMetaData(),将应用Deletion修改的条件改为比较Deletion的offset和chunkMetadata的offset。
  2. 查询过程中将每个tsFile的命名version记录到TsfileResource中,在deletion被写入到mods文件时用这个version更新deletion记录。在SeriesReader中使用{ tsFileVersion, offset }作为代替version的metric,用于merge reader的中排序。
  3. Last查询需要获取每个序列的最新数据点时,比较多个chunk中的最大时间戳。如果出现最大时间戳相等的情况,则首先比较chunk所属的tsFile的文件version,再比较chunk的offset,最新数据点取offset更大的chunk数据。


Recover流程修改

重启后Recover流程需要关注对于flushingMemtable的处理。如果有flushingMemtable的情况下重启server,会导致该flushingMemtable对应的TsfileResource处于crashed状态,需要通过WAL进行恢复。

...