Fixed a potential write hang
Summary: Currently, when something badly happen in the DB::Write() while the write-queue contains more than one element, the current design seems to forget to clean up the queue as well as wake-up all the writers, this potentially makes rocksdb hang on writes. Test Plan: make all check Reviewers: sdong, ljin, igor, haobo Reviewed By: haobo Subscribers: leveldb Differential Revision: https://reviews.facebook.net/D19167
This commit is contained in:
parent
bae495740d
commit
4f5ccfd179
@ -3862,19 +3862,19 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) {
|
|||||||
}
|
}
|
||||||
if (status.ok()) {
|
if (status.ok()) {
|
||||||
PERF_TIMER_START(write_memtable_time);
|
PERF_TIMER_START(write_memtable_time);
|
||||||
|
|
||||||
status = WriteBatchInternal::InsertInto(
|
status = WriteBatchInternal::InsertInto(
|
||||||
updates, column_family_memtables_.get(), false, 0, this, false);
|
updates, column_family_memtables_.get(), false, 0, this, false);
|
||||||
PERF_TIMER_STOP(write_memtable_time);
|
// A non-OK status here indicates iteration failure (either in-memory
|
||||||
|
// writebatch corruption (very bad), or the client specified invalid
|
||||||
if (!status.ok()) {
|
// column family). This will later on trigger bg_error_.
|
||||||
// Iteration failed (either in-memory writebatch corruption (very
|
//
|
||||||
// bad), or the client specified invalid column family). Return
|
|
||||||
// failure.
|
|
||||||
// Note that existing logic was not sound. Any partial failure writing
|
// Note that existing logic was not sound. Any partial failure writing
|
||||||
// into the memtable would result in a state that some write ops might
|
// into the memtable would result in a state that some write ops might
|
||||||
// have succeeded in memtable but Status reports error for all writes.
|
// have succeeded in memtable but Status reports error for all writes.
|
||||||
return status;
|
|
||||||
}
|
PERF_TIMER_STOP(write_memtable_time);
|
||||||
|
|
||||||
SetTickerCount(options_.statistics.get(), SEQUENCE_NUMBER,
|
SetTickerCount(options_.statistics.get(), SEQUENCE_NUMBER,
|
||||||
last_sequence);
|
last_sequence);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user