diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/repl/oplog_applier_impl.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/repl/oplog_applier_impl_test.cpp | 18 |
2 files changed, 9 insertions, 15 deletions
diff --git a/src/mongo/db/repl/oplog_applier_impl.cpp b/src/mongo/db/repl/oplog_applier_impl.cpp index 7f41a03865d..e61ec3397a0 100644 --- a/src/mongo/db/repl/oplog_applier_impl.cpp +++ b/src/mongo/db/repl/oplog_applier_impl.cpp @@ -43,6 +43,7 @@ #include "mongo/db/db_raii.h" #include "mongo/db/repl/apply_ops.h" #include "mongo/db/repl/oplog_applier_utils.h" +#include "mongo/db/repl/oplog_batcher.h" #include "mongo/db/repl/repl_server_parameters_gen.h" #include "mongo/db/repl/transaction_oplog_application.h" #include "mongo/db/session/logical_session_id.h" @@ -734,8 +735,9 @@ void OplogApplierImpl::_deriveOpsAndFillWriterVectors( } if (op.getCommandType() == OplogEntry::CommandType::kAbortTransaction) { - auto& partialTxnList = partialTxnOps[*op.getSessionId()]; - partialTxnList.clear(); + // Under current oplog batching rules, it is not possible for abortTransaction to + // be in the same batch as a preceding partial transaction applyOps oplog entry. + invariant(partialTxnOps.empty(), op.toStringForLogging()); } // Extract applyOps operations and fill writers with extracted operations using this diff --git a/src/mongo/db/repl/oplog_applier_impl_test.cpp b/src/mongo/db/repl/oplog_applier_impl_test.cpp index 3104fe5a8ea..7252aabc100 100644 --- a/src/mongo/db/repl/oplog_applier_impl_test.cpp +++ b/src/mongo/db/repl/oplog_applier_impl_test.cpp @@ -1966,8 +1966,9 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyAbortPreparedTransactio DurableTxnStateEnum::kAborted); } -TEST_F(MultiOplogEntryPreparedTransactionTest, - MultiApplyAbortPreparedTransactionCheckTxnTableSingleBatch) { +DEATH_TEST_REGEX_F(MultiOplogEntryPreparedTransactionTest, + MultiApplyAbortPreparedTransactionCheckTxnTableSingleBatch, + "Invariant.*partialTxnOps.*abortTransaction") { NoopOplogApplierObserver observer; OplogApplierImpl oplogApplier( nullptr, // executor @@ -1990,17 +1991,8 @@ TEST_F(MultiOplogEntryPreparedTransactionTest, ASSERT(OplogBatcher::mustProcessIndividually(*_abortPrepareWithPrevOp)); getStorageInterface()->oplogDiskLocRegister( _opCtx.get(), _abortPrepareWithPrevOp->getTimestamp(), true); - ASSERT_OK(oplogApplier.applyOplogBatch( - _opCtx.get(), {*_insertOp1, *_insertOp2, *_prepareWithPrevOp, *_abortPrepareWithPrevOp})); - ASSERT_BSONOBJ_EQ(_abortPrepareWithPrevOp->getEntry().toBSON(), oplogDocs().back()); - ASSERT_EQ(1U, _insertedDocs[_nss1].size()); - ASSERT_EQ(2U, _insertedDocs[_nss2].size()); - checkTxnTable(_lsid, - _txnNum, - _abortPrepareWithPrevOp->getOpTime(), - _abortPrepareWithPrevOp->getWallClockTime(), - boost::none, - DurableTxnStateEnum::kAborted); + (void)oplogApplier.applyOplogBatch( + _opCtx.get(), {*_insertOp1, *_insertOp2, *_prepareWithPrevOp, *_abortPrepareWithPrevOp}); } TEST_F(MultiOplogEntryPreparedTransactionTest, MultiApplyPreparedTransactionInitialSync) { |