RocksDB代码分析——Flush流程

阅读量: searchstar 2022-03-03 15:22:47
Categories: Tags:

这里从DBImpl::MaybeScheduleFlushOrCompaction开始讲起。

DBImpl::MaybeScheduleFlushOrCompaction可能会scheduleDBImpl::BGWorkFlushDBImpl::BGWorkCompaction。这里主要看Flush。Compaction部分见:RocksDB代码分析——Compaction流程

DBImpl::BGWorkFlush中调用了DBImpl::BackgroundCallFlush

DBImpl::BackgroundCallFlush中先上DB锁,然后调用DBImpl::BackgroundFlush,最后再调用DBImpl::MaybeScheduleFlushOrCompaction

DBImpl::BackgroundFlush中先调用DBImpl::PopFirstFromFlushQueueDBImpl::flush_queue_中取出FlushRequest flush_req(唯一的取出者),从中再取出ColumnFamilyData。再把这些ColumnFamilyData放进bg_flush_args,作为DBImpl::FlushMemTablesToOutputFiles的参数。DBImpl::flush_queue_里的FlushRequest的来源见:RocksDB代码分析——写入流程。最后再将这些ColumnFamilyDataUnrefAndTryDelete

DBImpl::FlushMemTablesToOutputFiles中,如果不是atomic_flush(默认),那么一定只有一个要flush的MemTable。把ColumnFamilyData拿出来,作为参数传给DBImpl::FlushMemTableToOutputFile

构造FlushJob flush_job,然后执行flush_job.Run,也就是调用FlushJob::Run
>调用FlushJob::WriteLevel0Table,把MemTable写入到L0层。在里面会先把DB锁解开,写入完成之后再锁上。
>调用MemTableList::TryInstallMemtableFlushResults
>>将被flush的memory table的flush_completed_标记为true
>>从老到新把所有flush_completed_的immutable memory table都通过VersionSet::LogAndApply commit。

然后把ColumnFamilyData作为参数调用DBImpl::InstallSuperVersionAndScheduleWork
>因为把MemTable写入到L0层之后总是会想要把这些SSTable给compact到L1层,所以接下来准备schedule compaction。
>把ColumnFamilyData作为参数调用DBImpl::SchedulePendingCompaction
>>将ColumnFamilyData传给DBImpl::AddToCompactionQueue,从而将其加入到DBImpl::compaction_queue_中。
>
>调用DBImpl::MaybeScheduleFlushOrCompaction
>接下来的compaction流程看这里:RocksDB代码分析——Compaction流程