前文已经明确了一次compaction的源层文件与目标层文件。
这次,咱们聊聊怎么具体的执行一次compaction。
线程调度
RocksDB 的 compaction 触发入口是 DBImpl::MaybeScheduleFlushOrCompaction。在这里使用线程池 开启一个个compact任务
它主要包括3种触发方式:
- switch wal:当 WAL 的文件大小超过阈值时
- writer buffer full:当 memtable 写满时
- schedule compaction:其余由更上层逻辑触发的 compaction,如 manual compaction
前两种的调用路径分别是:
DBImpl::WriteImpl
DBImpl::PreprocessWrite
DBImpl::SwitchWAL
DBImpl::MaybeScheduleFlushOrCompaction
DBImpl::WriteImpl
DBImpl::PreprocessWrite
DBImpl::HandleWriteBufferFull
DBImpl::MaybeScheduleFlushOrCompaction
在MaybeScheduleFlushOrCompaction内部,在最终调用
env_->Schedule(&DBImpl::BGWorkCompaction, ca, Env::Priority::LOW, this,
&DBImpl::UnscheduleCompactionCallback);
之前会判断unscheduled_compactions_是否大于0.也就是判断是否有需要进行compact的任务。
而unscheduled_compactions_的更新是在SchedulePendingCompaction,它的调用流程是:
DBImpl::BackgroundFlush
DBImpl::FlushMemTablesToOutputFiles
DBImpl::FlushMemTableToOutputFile
DBImpl::InstallSuperVersionAndScheduleWork
DBImpl::SchedulePendingCompaction
in SchedulePendingCompaction unscheduled_compactions_++ and AddToCompactionQueue
之后的流程就是
DBImpl::MaybeScheduleFlushOrCompaction
env_->Schedule(&DBImpl::BGWorkCompaction, ca, Env::Priority::LOW, this,
&DBImpl::UnscheduleCompactionCallback);
ca.db->BackgroundCallCompaction

3347

被折叠的 条评论
为什么被折叠?



