触发
在下面这几种条件下RocksDB会flush memtable到磁盘.
- 当某一个memtable的大小超过write_buffer_size.
- 当总的memtable的大小超过db_write_buffer_size.
- 当WAL文件的大小超过max_total_wal_size之后 最后一个条件的原因是,当WAL文件大小太大之后,我们需要清理WAL,因此此时我们需要将此WAL对应的数据都刷新到磁盘,也是刷新Memtable.
流程:
flush memtable到磁盘,是由后台线程BGWorkFlush来做的;
MaybeScheduleFlushOrCompaction ->BGWorkFlush ->BackgroundCallFlush ->BackgroundFlush ->FlushMemTablesToOutputFiles
PickMemTable ->PickMemtablesToFlush
FlushJob::Run ->WriteLevel0Table ->调用BuildTable函数构造SSTable
另一为TryInstallMemtableFlushResults函数完成与manifest的交互,将flush的结果commit到manifest。 InstallSuperVersionAndScheduleWork //@@@因为flush完成后,会更改RocksDB的元信息,比如新增了SST文件/blob文件, //释放了一些immutable等,所以此时需要将新的SuperVersion //install到cfd中,FlushMemTableToOutputFile通过调用InstallSuperVersionAndScheduleWork完成这一步骤。
传入参数是:SuperVersionContext
启动的时候原生会加载数据到memtable然后flush
,下面文章做了简单优化
TryInstallMemtableFlushResults