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:
parent
fb571509a7
commit
908b1ee64e
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user