WriteUnPrepared: Fix assertion during recovery (#6419)

Summary:
During recovery, multiple (un)prepared batches could exist in the same WAL record due to group commit. This breaks an assertion in `MemTableInserter::MarkBeginPrepare`.

To fix, reset unprepared_batch_ to false after `MarkEndPrepare`.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6419

Differential Revision: D19896148

Pulled By: lth

fbshipit-source-id: b1a32ef88f775a0881264a18bd1a4a5b8c85eee3
This commit is contained in:
Manuel Ung 2020-02-13 18:50:01 -08:00 committed by Facebook Github Bot
parent fb571509a7
commit 908b1ee64e

View File

@ -1828,8 +1828,9 @@ class MemTableInserter : public WriteBatch::Handler {
// we are now iterating through a prepared section // we are now iterating through a prepared section
rebuilding_trx_ = new WriteBatch(); rebuilding_trx_ = new WriteBatch();
rebuilding_trx_seq_ = sequence_; rebuilding_trx_seq_ = sequence_;
// We only call MarkBeginPrepare once per batch, and unprepared_batch_ // Verify that we have matching MarkBeginPrepare/MarkEndPrepare markers.
// is initialized to false by default. // unprepared_batch_ should be false because it is false by default, and
// gets reset to false in MarkEndPrepare.
assert(!unprepared_batch_); assert(!unprepared_batch_);
unprepared_batch_ = unprepare; unprepared_batch_ = unprepare;
@ -1854,6 +1855,7 @@ class MemTableInserter : public WriteBatch::Handler {
db_->InsertRecoveredTransaction(recovering_log_number_, name.ToString(), db_->InsertRecoveredTransaction(recovering_log_number_, name.ToString(),
rebuilding_trx_, rebuilding_trx_seq_, rebuilding_trx_, rebuilding_trx_seq_,
batch_cnt, unprepared_batch_); batch_cnt, unprepared_batch_);
unprepared_batch_ = false;
rebuilding_trx_ = nullptr; rebuilding_trx_ = nullptr;
} else { } else {
assert(rebuilding_trx_ == nullptr); assert(rebuilding_trx_ == nullptr);