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.PickMemTable(),把MemTable的VersionEdit存在FlushJob::edit_里。
flush_job.Run,也就是调用FlushJob::Run
>调用FlushJob::WriteLevel0Table
>>db_mutex_->Unlock();
>>BuildTable
>>db_mutex_->Lock();
>>edit_->AddFile。这个edit_实际上是MemTable的VersionEdit
>
>调用MemTableList::TryInstallMemtableFlushResults
>>将被flush的memory table的flush_completed_标记为true
>>从老到新把所有flush_completed_的immutable memory table的VersionEdit存进edit_list,然后通过VersionSet::LogAndApply commit这些edit,里面调用VersionSet::ProcessManifestWrites
>>>调用VersionBuilder::Apply,里面调用VersionBuilder::Rep::Apply,里面调用VersionBuilder::Rep::ApplyFileAddition,最终将file_number存到VersionBuilder::Rep::levels_[level].added_files里。
>>>调用VersionBuilder::SaveTo,里面调用VersionBuilder::Rep::SaveTo,里面调用VersionBuilder::Rep::SaveSSTFilesTo,先对VersionBuilder::Rep::levels_[level].added_files排序,L0的SSTable用NewestFirstBySeqNo排序,其他的用BySmallestKey排序,然后跟老version里已有的SSTable merge到一个新的version。

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