RocksDB代码分析——Flush流程
这里从DBImpl::MaybeScheduleFlushOrCompaction开始讲起。
DBImpl::MaybeScheduleFlushOrCompaction可能会scheduleDBImpl::BGWorkFlush和DBImpl::BGWorkCompaction。这里主要看Flush。Compaction部分见:RocksDB代码分析——Compaction流程
DBImpl::BGWorkFlush中调用了DBImpl::BackgroundCallFlush。
DBImpl::BackgroundCallFlush中先上DB锁,然后调用DBImpl::BackgroundFlush,最后再调用DBImpl::MaybeScheduleFlushOrCompaction。
DBImpl::BackgroundFlush中先调用DBImpl::PopFirstFromFlushQueue从DBImpl::flush_queue_中取出FlushRequest flush_req(唯一的取出者),从中再取出ColumnFamilyData。再把这些ColumnFamilyData放进bg_flush_args,作为DBImpl::FlushMemTablesToOutputFiles的参数。DBImpl::flush_queue_里的FlushRequest的来源见:RocksDB代码分析——写入流程。最后再将这些ColumnFamilyData给UnrefAndTryDelete。
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::LogAndApplycommit这些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流程看这里:

浙公网安备 33010602011771号