leveldb 学习记录(八) compact

随着运行时间的增加,memtable会慢慢 转化成 sstable。

sstable会越来越多 我们就需要进行整合 compact

代码会在写入查询key值 db写入时等多出位置调用MaybeScheduleCompaction () 

检测是否需要进行compact

 1 void DBImpl::MaybeScheduleCompaction() {
 2   mutex_.AssertHeld();
 3   if (bg_compaction_scheduled_) {
 4     // Already scheduled
 5   } else if (shutting_down_.Acquire_Load()) {
 6     // DB is being deleted; no more background compactions
 7   } else if (imm_ == NULL &&
 8              manual_compaction_ == NULL &&
 9              !versions_->NeedsCompaction()) {
10     // No work to be done
11   } else {
12     bg_compaction_scheduled_ = true;
13     env_->Schedule(&DBImpl::BGWork, this);
14   }
15 }
16 
17 void DBImpl::BGWork(void* db) {
18   reinterpret_cast<DBImpl*>(db)->BackgroundCall();
19 }
20 
21 void DBImpl::BackgroundCall() {
22   MutexLock l(&mutex_);
23   assert(bg_compaction_scheduled_);
24   if (!shutting_down_.Acquire_Load()) {
25     BackgroundCompaction();
26   }
27   bg_compaction_scheduled_ = false;
28 
29   // Previous compaction may have produced too many files in a level,
30   // so reschedule another compaction if needed.
31   MaybeScheduleCompaction();
32   bg_cv_.SignalAll();
33 }

实际进行compact的函数是 void DBImpl::BackgroundCompaction() 

猜你喜欢

转载自www.cnblogs.com/itdef/p/9809017.html