}
LogFlush(options_.info_log);
+ {
+ MutexLock l(&mutex_);
+ // an automatic compaction that has been scheduled might have been
+ // preempted by the manual compactions. Need to schedule it back.
+ MaybeScheduleFlushOrCompaction();
+ }
+
return s;
}
bg_cv_.Wait();
} else {
manual_compaction_ = &manual;
- MaybeScheduleFlushOrCompaction();
+ assert(bg_compaction_scheduled_ == 0);
+ bg_compaction_scheduled_++;
+ env_->Schedule(&DBImpl::BGWorkCompaction, this, Env::Priority::LOW);
}
}
assert(!manual.in_progress);
assert(bg_manual_only_ > 0);
--bg_manual_only_;
- if (bg_manual_only_ == 0) {
- // an automatic compaction should have been scheduled might have be
- // preempted by the manual compactions. Need to schedule it back.
- MaybeScheduleFlushOrCompaction();
- }
return manual.status;
}
// Schedule BGWorkCompaction if there's a compaction pending (or a memtable
// flush, but the HIGH pool is not enabled)
- // Do it only if max_background_compactions hasn't been reached and, in case
- // bg_manual_only_ > 0, if it's a manual compaction.
- if ((manual_compaction_ || is_compaction_needed ||
- (is_flush_pending && options_.max_background_flushes == 0)) &&
- (!bg_manual_only_ || manual_compaction_)) {
+ // Do it only if max_background_compactions hasn't been reached and
+ // bg_manual_only_ == 0
+ if (!bg_manual_only_ &&
+ (is_compaction_needed ||
+ (is_flush_pending && options_.max_background_flushes == 0))) {
if (bg_compaction_scheduled_ < options_.max_background_compactions) {
bg_compaction_scheduled_++;
env_->Schedule(&DBImpl::BGWorkCompaction, this, Env::Priority::LOW);
if (is_manual) {
// another thread cannot pick up the same work
manual_compaction_->in_progress = true;
+ } else if (manual_compaction_ != nullptr) {
+ // there should be no automatic compactions running when manual compaction
+ // is running
+ return Status::OK();
}
// FLUSH preempts compaction