diff options
Diffstat (limited to 'src/mongo/db/transaction_participant_test.cpp')
-rw-r--r-- | src/mongo/db/transaction_participant_test.cpp | 209 |
1 files changed, 46 insertions, 163 deletions
diff --git a/src/mongo/db/transaction_participant_test.cpp b/src/mongo/db/transaction_participant_test.cpp index a186012cc2b..5fe79784bbf 100644 --- a/src/mongo/db/transaction_participant_test.cpp +++ b/src/mongo/db/transaction_participant_test.cpp @@ -499,7 +499,7 @@ TEST_F(TxnParticipantTest, AbortClearsStoredStatements) { // The transaction machinery cannot store an empty locker. { Lock::GlobalLock lk(opCtx(), MODE_IX, Date_t::now(), Lock::InterruptBehavior::kThrow); } txnParticipant.stashTransactionResources(opCtx()); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(txnParticipant.getTransactionOperationsForTest().empty()); ASSERT_TRUE(txnParticipant.transactionIsAborted()); } @@ -713,7 +713,7 @@ TEST_F(TxnParticipantTest, EmptyTransactionAbort) { // The transaction machinery cannot store an empty locker. { Lock::GlobalLock lk(opCtx(), MODE_IX, Date_t::now(), Lock::InterruptBehavior::kThrow); } txnParticipant.stashTransactionResources(opCtx()); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(txnParticipant.transactionIsAborted()); } @@ -727,37 +727,10 @@ TEST_F(TxnParticipantTest, EmptyPreparedTransactionAbort) { // The transaction machinery cannot store an empty locker. { Lock::GlobalLock lk(opCtx(), MODE_IX, Date_t::now(), Lock::InterruptBehavior::kThrow); } txnParticipant.prepareTransaction(opCtx(), {}); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(txnParticipant.transactionIsAborted()); } -TEST_F(TxnParticipantTest, KillSessionsDuringPrepareDoesNotAbortTransaction) { - auto sessionCheckout = checkOutSession(); - auto txnParticipant = TransactionParticipant::get(opCtx()); - - txnParticipant.unstashTransactionResources(opCtx(), "prepareTransaction"); - - auto ruPrepareTimestamp = Timestamp(); - auto originalFn = _opObserver->onTransactionPrepareFn; - _opObserver->onTransactionPrepareFn = [&]() { - originalFn(); - - ruPrepareTimestamp = opCtx()->recoveryUnit()->getPrepareTimestamp(); - ASSERT_FALSE(ruPrepareTimestamp.isNull()); - - // The transaction may be aborted without checking out the txnParticipant. - txnParticipant.abortTransactionIfNotPrepared(opCtx()); - ASSERT_FALSE(txnParticipant.transactionIsAborted()); - }; - - // Check that prepareTimestamp gets set. - auto prepareTimestamp = txnParticipant.prepareTransaction(opCtx(), {}); - ASSERT_EQ(ruPrepareTimestamp, prepareTimestamp); - - ASSERT(_opObserver->transactionPrepared); - ASSERT_FALSE(txnParticipant.transactionIsAborted()); -} - TEST_F(TxnParticipantTest, KillOpBeforeCommittingPreparedTransaction) { auto sessionCheckout = checkOutSession(); auto txnParticipant = TransactionParticipant::get(opCtx()); @@ -809,7 +782,7 @@ TEST_F(TxnParticipantTest, KillOpBeforeAbortingPreparedTransaction) { opCtx()->markKilled(ErrorCodes::Interrupted); try { // The abort should throw, since the operation was killed. - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); } catch (const DBException& ex) { ASSERT_EQ(ErrorCodes::Interrupted, ex.code()); } @@ -915,7 +888,7 @@ TEST_F(TxnParticipantTest, StepDownAfterPrepareDoesNotBlock) { }; runFunctionFromDifferentOpCtx(func); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(_opObserver->transactionAborted); ASSERT(txnParticipant.transactionIsAborted()); } @@ -947,7 +920,7 @@ TEST_F(TxnParticipantTest, StepDownDuringAbortSucceeds) { ASSERT_OK(repl::ReplicationCoordinator::get(opCtx())->setFollowerMode( repl::MemberState::RS_SECONDARY)); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(_opObserver->transactionAborted); ASSERT(txnParticipant.transactionIsAborted()); } @@ -962,7 +935,7 @@ TEST_F(TxnParticipantTest, StepDownDuringPreparedAbortFails) { ASSERT_OK(repl::ReplicationCoordinator::get(opCtx())->setFollowerMode( repl::MemberState::RS_SECONDARY)); ASSERT_THROWS_CODE( - txnParticipant.abortActiveTransaction(opCtx()), AssertionException, ErrorCodes::NotMaster); + txnParticipant.abortTransaction(opCtx()), AssertionException, ErrorCodes::NotMaster); } TEST_F(TxnParticipantTest, StepDownDuringPreparedCommitFails) { @@ -1018,7 +991,7 @@ TEST_F(TxnParticipantTest, StepDownDuringPreparedAbortReleasesRSTL) { ASSERT_OK(repl::ReplicationCoordinator::get(opCtx())->setFollowerMode( repl::MemberState::RS_SECONDARY)); ASSERT_THROWS_CODE( - txnParticipant.abortActiveTransaction(opCtx()), AssertionException, ErrorCodes::NotMaster); + txnParticipant.abortTransaction(opCtx()), AssertionException, ErrorCodes::NotMaster); ASSERT_EQ(opCtx()->lockState()->getLockMode(resourceIdReplicationStateTransitionLock), MODE_NONE); @@ -1101,7 +1074,7 @@ TEST_F(TxnParticipantTest, ThrowDuringUnpreparedCommitLetsTheAbortAtEntryPointTo ASSERT_FALSE(txnParticipant.transactionIsCommitted()); // Simulate the abort at entry point. - txnParticipant.abortActiveUnpreparedOrStashPreparedTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(txnParticipant.transactionIsAborted()); } @@ -1119,56 +1092,6 @@ TEST_F(TxnParticipantTest, ContinuingATransactionWithNoResourcesAborts) { ErrorCodes::NoSuchTransaction); } -TEST_F(TxnParticipantTest, KillSessionsDoesNotAbortPreparedTransactions) { - auto sessionCheckout = checkOutSession(); - auto txnParticipant = TransactionParticipant::get(opCtx()); - - txnParticipant.unstashTransactionResources(opCtx(), "insert"); - - auto ruPrepareTimestamp = Timestamp(); - auto originalFn = _opObserver->onTransactionPrepareFn; - _opObserver->onTransactionPrepareFn = [&]() { - originalFn(); - ruPrepareTimestamp = opCtx()->recoveryUnit()->getPrepareTimestamp(); - ASSERT_FALSE(ruPrepareTimestamp.isNull()); - }; - - // Check that prepareTimestamp gets set. - auto prepareTimestamp = txnParticipant.prepareTransaction(opCtx(), {}); - ASSERT_EQ(ruPrepareTimestamp, prepareTimestamp); - - txnParticipant.stashTransactionResources(opCtx()); - - txnParticipant.abortTransactionIfNotPrepared(opCtx()); - ASSERT_FALSE(txnParticipant.transactionIsAborted()); - ASSERT(_opObserver->transactionPrepared); -} - -TEST_F(TxnParticipantTest, CannotAbortArbitraryPreparedTransactions) { - auto sessionCheckout = checkOutSession(); - auto txnParticipant = TransactionParticipant::get(opCtx()); - - txnParticipant.unstashTransactionResources(opCtx(), "insert"); - - auto ruPrepareTimestamp = Timestamp(); - auto originalFn = _opObserver->onTransactionPrepareFn; - _opObserver->onTransactionPrepareFn = [&]() { - originalFn(); - ruPrepareTimestamp = opCtx()->recoveryUnit()->getPrepareTimestamp(); - ASSERT_FALSE(ruPrepareTimestamp.isNull()); - }; - - // Check that prepareTimestamp gets set. - auto prepareTimestamp = txnParticipant.prepareTransaction(opCtx(), {}); - ASSERT_EQ(ruPrepareTimestamp, prepareTimestamp); - - txnParticipant.stashTransactionResources(opCtx()); - - txnParticipant.abortTransactionIfNotPrepared(opCtx()); - ASSERT(!txnParticipant.transactionIsAborted()); - ASSERT(_opObserver->transactionPrepared); -} - TEST_F(TxnParticipantTest, CannotStartNewTransactionIfNotPrimary) { ASSERT_OK(repl::ReplicationCoordinator::get(opCtx())->setFollowerMode( repl::MemberState::RS_SECONDARY)); @@ -1277,23 +1200,6 @@ TEST_F(TxnParticipantTest, CannotInsertInPreparedTransaction) { ASSERT(_opObserver->transactionPrepared); } -TEST_F(TxnParticipantTest, ImplicitAbortDoesNotAbortPreparedTransaction) { - auto outerScopedSession = checkOutSession(); - auto txnParticipant = TransactionParticipant::get(opCtx()); - - txnParticipant.unstashTransactionResources(opCtx(), "insert"); - auto operation = repl::OplogEntry::makeInsertOperation(kNss, _uuid, BSON("TestValue" << 0)); - txnParticipant.addTransactionOperation(opCtx(), operation); - - txnParticipant.prepareTransaction(opCtx(), {}); - - // The next command throws an exception and wants to abort the transaction. - // This is a no-op. - txnParticipant.abortActiveUnpreparedOrStashPreparedTransaction(opCtx()); - ASSERT_FALSE(txnParticipant.transactionIsAborted()); - ASSERT_TRUE(_opObserver->transactionPrepared); -} - TEST_F(TxnParticipantTest, CannotContinueNonExistentTransaction) { MongoDOperationContextSession opCtxSession(opCtx()); auto txnParticipant = TransactionParticipant::get(opCtx()); @@ -1397,7 +1303,7 @@ protected: auto txnParticipant = TransactionParticipant::get(opCtx()); ASSERT(txnParticipant.transactionIsOpen()); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); txnParticipant.beginOrContinue( @@ -1453,7 +1359,7 @@ protected: txnParticipant.prepareTransaction(opCtx(), {}); ASSERT(txnParticipant.transactionIsPrepared()); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); startTransaction = true; @@ -1567,9 +1473,8 @@ TEST_F(TxnParticipantTest, ThrowDuringUnpreparedOnTransactionAbort) { _opObserver->onTransactionAbortThrowsException = true; - ASSERT_THROWS_CODE(txnParticipant.abortActiveTransaction(opCtx()), - AssertionException, - ErrorCodes::OperationFailed); + ASSERT_THROWS_CODE( + txnParticipant.abortTransaction(opCtx()), AssertionException, ErrorCodes::OperationFailed); } TEST_F(TxnParticipantTest, ThrowDuringPreparedOnTransactionAbortIsFatal) { @@ -1580,9 +1485,8 @@ TEST_F(TxnParticipantTest, ThrowDuringPreparedOnTransactionAbortIsFatal) { _opObserver->onTransactionAbortThrowsException = true; - ASSERT_THROWS_CODE(txnParticipant.abortActiveTransaction(opCtx()), - AssertionException, - ErrorCodes::OperationFailed); + ASSERT_THROWS_CODE( + txnParticipant.abortTransaction(opCtx()), AssertionException, ErrorCodes::OperationFailed); } TEST_F(TxnParticipantTest, InterruptedSessionsCannotBePrepared) { @@ -1647,7 +1551,7 @@ TEST_F(TxnParticipantTest, ReacquireLocksForPreparedTransactionsOnStepUp) { auto txnParticipant = TransactionParticipant::get(opCtx()); ASSERT(txnParticipant.getTxnResourceStashLockerForTest()->isLocked()); txnParticipant.unstashTransactionResources(opCtx(), "abortTransaction"); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); } } @@ -1742,7 +1646,7 @@ TEST_F(TransactionsMetricsTest, IncrementTotalAbortedUponAbort) { unsigned long long beforeAbortCount = ServerTransactionsMetrics::get(opCtx())->getTotalAborted(); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); // Assert that the aborted counter is incremented by 1. ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getTotalAborted(), beforeAbortCount + 1U); @@ -1757,7 +1661,7 @@ TEST_F(TransactionsMetricsTest, IncrementTotalPreparedThenAborted) { txnParticipant.unstashTransactionResources(opCtx(), "prepareTransaction"); txnParticipant.prepareTransaction(opCtx(), {}); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getTotalPreparedThenAborted(), beforePreparedThenAbortedCount + 1U); @@ -1791,7 +1695,7 @@ TEST_F(TransactionsMetricsTest, IncrementCurrentPreparedWithAbort) { ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentPrepared(), beforeCurrentPrepared + 1U); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentPrepared(), beforeCurrentPrepared); } @@ -1824,7 +1728,8 @@ TEST_F(TransactionsMetricsTest, NoPreparedMetricsChangesAfterExceptionInPrepare) ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getTotalPreparedThenAborted(), beforeTotalPreparedThenAborted); - txnParticipant.abortActiveTransaction(opCtx()); + if (txnParticipant.transactionIsOpen()) + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentPrepared(), beforeCurrentPrepared); @@ -1853,7 +1758,7 @@ TEST_F(TransactionsMetricsTest, TrackTotalOpenTransactionsWithAbort) { beforeTransactionStart + 1U); // Tests that aborting a transaction decrements the open transactions counter by 1. - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentOpen(), beforeTransactionStart); } @@ -1949,7 +1854,7 @@ TEST_F(TransactionsMetricsTest, TrackTotalActiveAndInactiveTransactionsWithStash beforeInactiveCounter + 1U); // Tests that aborting a stashed transaction decrements the inactive counter only. - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentActive(), beforeActiveCounter); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentInactive(), beforeInactiveCounter); } @@ -1974,7 +1879,7 @@ TEST_F(TransactionsMetricsTest, TrackTotalActiveAndInactiveTransactionsWithUnsta ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentInactive(), beforeInactiveCounter); // Tests that aborting a stashed transaction decrements the active counter only. - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentActive(), beforeActiveCounter); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentInactive(), beforeInactiveCounter); } @@ -2059,7 +1964,7 @@ TEST_F(TransactionsMetricsTest, beforeActivePreparedCounter + 1U); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentInactive(), beforeInactivePreparedCounter); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.transactionIsAborted()); ASSERT_EQ(ServerTransactionsMetrics::get(opCtx())->getCurrentActive(), beforeActivePreparedCounter); @@ -2154,7 +2059,7 @@ TEST_F(TransactionsMetricsTest, SingleTransactionStatsDurationShouldBeSetUponAbo // Advance the clock. tickSource->advance(Microseconds(100)); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getDuration(tickSource, tickSource->getTicks()), Microseconds(100)); @@ -2174,7 +2079,7 @@ TEST_F(TransactionsMetricsTest, SingleTransactionStatsPreparedDurationShouldBeSe txnParticipant.prepareTransaction(opCtx(), {}); tickSource->advance(Microseconds(100)); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getPreparedDuration( tickSource, tickSource->getTicks()), Microseconds(100)); @@ -2265,7 +2170,7 @@ TEST_F(TransactionsMetricsTest, SingleTransactionStatsDurationShouldKeepIncreasi tickSource->advance(Microseconds(100)); // Abort the transaction and check duration. - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getDuration(tickSource, tickSource->getTicks()), Microseconds(200)); @@ -2299,7 +2204,7 @@ TEST_F(TransactionsMetricsTest, tickSource->advance(Microseconds(100)); // Abort the prepared transaction and check the prepared duration. - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getPreparedDuration( tickSource, tickSource->getTicks()), Microseconds(200)); @@ -2372,7 +2277,7 @@ TEST_F(TransactionsMetricsTest, TimeActiveMicrosShouldBeSetUponUnstashAndAbort) txnParticipant.unstashTransactionResources(opCtx(), "insert"); tickSource->advance(Microseconds(100)); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); // Time active should have increased. ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getTimeActiveMicros( @@ -2401,7 +2306,7 @@ TEST_F(TransactionsMetricsTest, TimeActiveMicrosShouldNotBeSetUponAbortOnly) { // Advance clock during inactive period. tickSource->advance(Microseconds(100)); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); // Time active should still be zero. ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getTimeActiveMicros( @@ -2594,7 +2499,7 @@ TEST_F(TransactionsMetricsTest, AdditiveMetricsObjectsShouldBeAddedTogetherUponA txnParticipant.unstashTransactionResources(opCtx(), "insert"); // The transaction machinery cannot store an empty locker. { Lock::GlobalLock lk(opCtx(), MODE_IX, Date_t::now(), Lock::InterruptBehavior::kThrow); } - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT(txnParticipant.getSingleTransactionStatsForTest().getOpDebug()->additiveMetrics.equals( additiveMetricsToCompare)); @@ -2658,7 +2563,7 @@ TEST_F(TransactionsMetricsTest, TimeInactiveMicrosShouldBeSetUponUnstashAndAbort Microseconds{100}); txnParticipant.unstashTransactionResources(opCtx(), "insert"); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_EQ(txnParticipant.getSingleTransactionStatsForTest().getTimeInactiveMicros( tickSource, tickSource->getTicks()), @@ -2991,7 +2896,7 @@ TEST_F(TransactionsMetricsTest, LastClientInfoShouldUpdateUponAbort) { auto sessionCheckout = checkOutSession(); auto txnParticipant = TransactionParticipant::get(opCtx()); txnParticipant.unstashTransactionResources(opCtx(), "insert"); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); // LastClientInfo should have been set. auto lastClientInfo = txnParticipant.getSingleTransactionStatsForTest().getLastClientInfo(); @@ -3261,7 +3166,7 @@ TEST_F(TransactionsMetricsTest, TestTransactionInfoForLogAfterAbort) { auto txnParticipant = TransactionParticipant::get(opCtx()); txnParticipant.unstashTransactionResources(opCtx(), "abortTransaction"); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); const auto lockerInfo = opCtx()->lockState()->getLockerInfo(boost::none); ASSERT(lockerInfo); @@ -3305,7 +3210,7 @@ TEST_F(TransactionsMetricsTest, TestPreparedTransactionInfoForLogAfterAbort) { txnParticipant.prepareTransaction(opCtx(), {}); tickSource->advance(Microseconds(10)); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); const auto lockerInfo = opCtx()->lockState()->getLockerInfo(boost::none); ASSERT(lockerInfo); @@ -3448,7 +3353,7 @@ TEST_F(TransactionsMetricsTest, LogTransactionInfoAfterSlowAbort) { tickSource->advance(Microseconds(11 * 1000)); startCapturingLogMessages(); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); stopCapturingLogMessages(); const auto lockerInfo = opCtx()->lockState()->getLockerInfo(boost::none); @@ -3493,7 +3398,7 @@ TEST_F(TransactionsMetricsTest, LogPreparedTransactionInfoAfterSlowAbort) { auto prepareOpTime = txnParticipant.getPrepareOpTime(); startCapturingLogMessages(); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); stopCapturingLogMessages(); const auto lockerInfo = opCtx()->lockState()->getLockerInfo(boost::none); @@ -3591,7 +3496,7 @@ TEST_F(TransactionsMetricsTest, LogTransactionInfoAfterSlowStashedAbort) { tickSource->advance(Microseconds(11 * 1000)); startCapturingLogMessages(); - txnParticipant.abortTransactionIfNotPrepared(opCtx()); + txnParticipant.abortTransaction(opCtx()); stopCapturingLogMessages(); std::string expectedTransactionInfo = "transaction parameters"; @@ -3676,9 +3581,10 @@ TEST_F(TxnParticipantTest, RollbackResetsInMemoryStateOfPreparedTransaction) { ASSERT_EQ(txnParticipant.getPrepareOpTime().getTimestamp(), prepareTimestamp); ASSERT_NE(txnParticipant.getActiveTxnNumber(), kUninitializedTxnNumber); - txnParticipant.abortPreparedTransactionForRollback(opCtx()); + txnParticipant.abortTransaction(opCtx()); + txnParticipant.invalidate(opCtx()); - // After calling abortPreparedTransactionForRollback, the state of txnParticipant should be + // After calling abortTransaction and invalidate, the state of txnParticipant should be // invalidated. ASSERT_FALSE(txnParticipant.transactionIsPrepared()); ASSERT_EQ(txnParticipant.getTransactionOperationsForTest().size(), 0U); @@ -3791,7 +3697,7 @@ TEST_F(TxnParticipantTest, AbortTransactionOnSessionCheckoutWithoutRefresh) { ASSERT_EQ(txnParticipant.getActiveTxnNumber(), txnNumber); txnParticipant.unstashTransactionResources(opCtx(), "abortTransaction"); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(txnParticipant.transactionIsAborted()); } @@ -3861,7 +3767,7 @@ TEST_F(TxnParticipantTest, ResponseMetadataHasReadOnlyFalseIfAborted) { txnParticipant.unstashTransactionResources(opCtx(), "find"); ASSERT_TRUE(txnParticipant.getResponseMetadata().getReadOnly()); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_FALSE(txnParticipant.getResponseMetadata().getReadOnly()); } @@ -3967,7 +3873,7 @@ TEST_F(TxnParticipantTest, ExitPreparePromiseIsFulfilledOnAbortAfterPrepare) { const auto exitPrepareFuture = txnParticipant.onExitPrepare(); ASSERT_FALSE(exitPrepareFuture.isReady()); - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); ASSERT_TRUE(exitPrepareFuture.isReady()); // Once the promise has been fulfilled, new callers of onExitPrepare should immediately be @@ -3975,7 +3881,7 @@ TEST_F(TxnParticipantTest, ExitPreparePromiseIsFulfilledOnAbortAfterPrepare) { ASSERT_TRUE(txnParticipant.onExitPrepare().isReady()); // abortTransaction is retryable, but does not cause the completion promise to be set again. - txnParticipant.abortActiveTransaction(opCtx()); + txnParticipant.abortTransaction(opCtx()); } TEST_F(TxnParticipantTest, ExitPreparePromiseIsFulfilledOnCommitAfterPrepare) { @@ -4004,28 +3910,5 @@ TEST_F(TxnParticipantTest, ExitPreparePromiseIsFulfilledOnCommitAfterPrepare) { ASSERT_TRUE(txnParticipant.onExitPrepare().isReady()); } -TEST_F(TxnParticipantTest, ExitPreparePromiseIsFulfilledOnAbortPreparedTransactionForRollback) { - MongoDOperationContextSession opCtxSession(opCtx()); - auto txnParticipant = TransactionParticipant::get(opCtx()); - - txnParticipant.beginOrContinue( - opCtx(), *opCtx()->getTxnNumber(), false /* autocommit */, true /* startTransaction */); - ASSERT_TRUE(txnParticipant.onExitPrepare().isReady()); - - txnParticipant.unstashTransactionResources(opCtx(), "find"); - ASSERT_TRUE(txnParticipant.onExitPrepare().isReady()); - - const auto prepareOpTime = repl::OpTime({3, 2}, 0); - txnParticipant.prepareTransaction(opCtx(), prepareOpTime); - const auto exitPrepareFuture = txnParticipant.onExitPrepare(); - ASSERT_FALSE(exitPrepareFuture.isReady()); - - txnParticipant.abortPreparedTransactionForRollback(opCtx()); - ASSERT_TRUE(exitPrepareFuture.isReady()); - - // Once the promise has been fulfilled, new callers of onExitPrepare should immediately be - // ready. - ASSERT_TRUE(txnParticipant.onExitPrepare().isReady()); -} } // namespace } // namespace mongo |