Fix extra compaction tasks scheduled after D16767 in some cases

Summary:
With D16767, there is a case compaction tasks are scheduled infinitely:
(1) no flush thread is configured and more than 1 compaction threads
(2) a flush is going on by one compaction hread
(3) the state of SST files is in the state that versions_->current()->NeedsCompaction() will generate a false positive (return true actually there is no work to be done)
In that case, a infinite loop will be formed.

This patch would fix it.

Test Plan: make all check

Reviewers: haobo, igor, ljin

Reviewed By: igor

CC: dhruba, yhchiang, leveldb

Differential Revision: https://reviews.facebook.net/D16863
This commit is contained in:
sdong 2014-03-13 11:21:03 -07:00
parent 04a1035efe
commit 5aa81f04fa

View File

@ -1842,7 +1842,7 @@ void DBImpl::MaybeScheduleFlushOrCompaction() {
// memtable flush needed // memtable flush needed
bg_flush_scheduled_++; bg_flush_scheduled_++;
env_->Schedule(&DBImpl::BGWorkFlush, this, Env::Priority::HIGH); env_->Schedule(&DBImpl::BGWorkFlush, this, Env::Priority::HIGH);
} else { } else if (options_.max_background_flushes > 0) {
bg_schedule_needed_ = true; bg_schedule_needed_ = true;
} }
} }