From 4f5ccfd1796d34f80121b2a6772a230fc6e6ba1d Mon Sep 17 00:00:00 2001 From: Yueh-Hsuan Chiang Date: Thu, 19 Jun 2014 14:53:03 -0700 Subject: [PATCH] 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 --- db/db_impl.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index a9706ab6d..290b67f16 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -3862,19 +3862,19 @@ Status DBImpl::Write(const WriteOptions& options, WriteBatch* my_batch) { } if (status.ok()) { PERF_TIMER_START(write_memtable_time); + status = WriteBatchInternal::InsertInto( updates, column_family_memtables_.get(), false, 0, this, false); + // A non-OK status here indicates iteration failure (either in-memory + // writebatch corruption (very bad), or the client specified invalid + // column family). This will later on trigger bg_error_. + // + // Note that existing logic was not sound. Any partial failure writing + // into the memtable would result in a state that some write ops might + // have succeeded in memtable but Status reports error for all writes. + PERF_TIMER_STOP(write_memtable_time); - if (!status.ok()) { - // 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 - // into the memtable would result in a state that some write ops might - // have succeeded in memtable but Status reports error for all writes. - return status; - } SetTickerCount(options_.statistics.get(), SEQUENCE_NUMBER, last_sequence); }