set bg_error_ when background flush goes wrong
Summary: as title Test Plan: unit test Reviewers: haobo, igor, sdong, kailiu, dhruba Reviewed By: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D15435
This commit is contained in:
parent
fb84c49a36
commit
d118707f8d
@ -1232,8 +1232,7 @@ Status DBImpl::FlushMemTableToOutputFile(bool* madeProgress,
|
|||||||
|
|
||||||
if (!imm_.IsFlushPending()) {
|
if (!imm_.IsFlushPending()) {
|
||||||
Log(options_.info_log, "FlushMemTableToOutputFile already in progress");
|
Log(options_.info_log, "FlushMemTableToOutputFile already in progress");
|
||||||
Status s = Status::IOError("FlushMemTableToOutputFile already in progress");
|
return Status::IOError("FlushMemTableToOutputFile already in progress");
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the contents of the earliest memtable as a new Table
|
// Save the contents of the earliest memtable as a new Table
|
||||||
@ -1242,8 +1241,7 @@ Status DBImpl::FlushMemTableToOutputFile(bool* madeProgress,
|
|||||||
imm_.PickMemtablesToFlush(&mems);
|
imm_.PickMemtablesToFlush(&mems);
|
||||||
if (mems.empty()) {
|
if (mems.empty()) {
|
||||||
Log(options_.info_log, "Nothing in memstore to flush");
|
Log(options_.info_log, "Nothing in memstore to flush");
|
||||||
Status s = Status::IOError("Nothing in memstore to flush");
|
return Status::IOError("Nothing in memstore to flush");
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// record the logfile_number_ before we release the mutex
|
// record the logfile_number_ before we release the mutex
|
||||||
@ -1925,6 +1923,13 @@ Status DBImpl::BackgroundCompaction(bool* madeProgress,
|
|||||||
*madeProgress = false;
|
*madeProgress = false;
|
||||||
mutex_.AssertHeld();
|
mutex_.AssertHeld();
|
||||||
|
|
||||||
|
bool is_manual = (manual_compaction_ != nullptr) &&
|
||||||
|
(manual_compaction_->in_progress == false);
|
||||||
|
if (is_manual) {
|
||||||
|
// another thread cannot pick up the same work
|
||||||
|
manual_compaction_->in_progress = true;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: remove memtable flush from formal compaction
|
// TODO: remove memtable flush from formal compaction
|
||||||
while (imm_.IsFlushPending()) {
|
while (imm_.IsFlushPending()) {
|
||||||
Log(options_.info_log,
|
Log(options_.info_log,
|
||||||
@ -1933,19 +1938,22 @@ Status DBImpl::BackgroundCompaction(bool* madeProgress,
|
|||||||
options_.max_background_compactions - bg_compaction_scheduled_);
|
options_.max_background_compactions - bg_compaction_scheduled_);
|
||||||
Status stat = FlushMemTableToOutputFile(madeProgress, deletion_state);
|
Status stat = FlushMemTableToOutputFile(madeProgress, deletion_state);
|
||||||
if (!stat.ok()) {
|
if (!stat.ok()) {
|
||||||
|
if (is_manual) {
|
||||||
|
manual_compaction_->status = stat;
|
||||||
|
manual_compaction_->done = true;
|
||||||
|
manual_compaction_->in_progress = false;
|
||||||
|
manual_compaction_ = nullptr;
|
||||||
|
}
|
||||||
return stat;
|
return stat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<Compaction> c;
|
unique_ptr<Compaction> c;
|
||||||
bool is_manual = (manual_compaction_ != nullptr) &&
|
|
||||||
(manual_compaction_->in_progress == false);
|
|
||||||
InternalKey manual_end_storage;
|
InternalKey manual_end_storage;
|
||||||
InternalKey* manual_end = &manual_end_storage;
|
InternalKey* manual_end = &manual_end_storage;
|
||||||
if (is_manual) {
|
if (is_manual) {
|
||||||
ManualCompaction* m = manual_compaction_;
|
ManualCompaction* m = manual_compaction_;
|
||||||
assert(!m->in_progress);
|
assert(m->in_progress);
|
||||||
m->in_progress = true; // another thread cannot pick up the same work
|
|
||||||
c.reset(versions_->CompactRange(
|
c.reset(versions_->CompactRange(
|
||||||
m->input_level, m->output_level, m->begin, m->end, &manual_end));
|
m->input_level, m->output_level, m->begin, m->end, &manual_end));
|
||||||
if (!c) {
|
if (!c) {
|
||||||
|
Loading…
Reference in New Issue
Block a user