谈谈RocksDB的Compaction2

前文已经明确了一次compaction的源层文件与目标层文件。
这次,咱们聊聊怎么具体的执行一次compaction。

线程调度

RocksDB 的 compaction 触发入口是 DBImpl::MaybeScheduleFlushOrCompaction。在这里使用线程池 开启一个个compact任务
它主要包括3种触发方式:

  1. switch wal:当 WAL 的文件大小超过阈值时
  2. writer buffer full:当 memtable 写满时
  3. 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值