summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mongo/db/repl/oplog_applier_impl.cpp6
-rw-r--r--src/mongo/db/repl/oplog_applier_impl_test.cpp18
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) {