RocksDB-SwitchMemtable流程中的处理点以及对应的原因分析

102 阅读2分钟

在上一篇文章中分析了SwitchWAL中一些关键处理点的原因,在SwitchMemtable的流程中同样存在一些难以理解的流程,这里简单分析记录一下原因:

1、为cf切换新的mutable memtable之前为什么要确保当前的active WAL完全未写入数据(即为空WAL)?

     这是因为在切换之前,cf的mutable memtable中的数据可能存在于[oldest alive WAL, active WAL]之间的所有WAL中。而当mutable memtable被添加到imm list之前,需要先记录不含有该memtable数据的最老WAL文件号信息(该信息很重要),因此就需要确保当前的active WAL完全未写入数据,该active WAL就是不含有该memtable数据的最老WAL文件。

2、如何确保active WAL完全未写入数据?

    1)新创建一个WAL文件,然后设置为DB的active WAL,或者:

    2)重命名并打开一个已经被回收的WAL,然后设置为DB的active WAL,或者:

    3)当前active WAL本来就还没有写入数据。

3、为什么mutable memtable被添加到imm list之前,记录不含有该memtable数据的最老WAL文件号信息(通过mem_next_logfile_number_字段保存)很重要?

     这是因为在对一个cf执行Flush任务时,需要根据PickMemtablesToFlush所选取的所有memtable中的该信息(mem_next_logfile_number_)来计算:含有该cf还未Flush数据的最老的WAL文件号(即cf的OldestLogToKeep信息)。这样当这些选取的memtable被flush到SST之后,所有文件号比OldestLogToKeep小的WAL对该cf来说都是可以安全回收删除的(这也是RocksDB的WAL回收机制)。

4、如何计算cf的OldestLogToKeep?

     1)在非mempurge场景下:为cf所pick的所有memtable都是已经按照创建时间升序排序的,因此选取的最后一个memtable的mem_next_logfile_number_即为该cf的最新OldestLogToKeep;

    2)在mempurge场景下:则在pick的过程计算所pick的memtable中的最大mem_next_logfile_number_即可。