summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCheahuychou Mao <mao.cheahuychou@gmail.com>2021-10-29 20:47:34 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-29 21:29:29 +0000
commit486ea6c419d62e9e47b3378baedfcedfdf77e48d (patch)
tree603ca02d8bb63e8e52c09df9c941a68cd68a1763
parent786482da93c3e5e58b1c690cb060f00c60864f69 (diff)
downloadmongo-486ea6c419d62e9e47b3378baedfcedfdf77e48d.tar.gz
SERVER-61118 TransactionCoordinator unit tests that create a second coordinator for a txnNumber should wait for the decision future of the previous coordinator
-rw-r--r--src/mongo/db/s/transaction_coordinator_catalog_test.cpp2
-rw-r--r--src/mongo/db/s/transaction_coordinator_service_test.cpp19
2 files changed, 16 insertions, 5 deletions
diff --git a/src/mongo/db/s/transaction_coordinator_catalog_test.cpp b/src/mongo/db/s/transaction_coordinator_catalog_test.cpp
index a8448293278..ceb5f4c155c 100644
--- a/src/mongo/db/s/transaction_coordinator_catalog_test.cpp
+++ b/src/mongo/db/s/transaction_coordinator_catalog_test.cpp
@@ -211,6 +211,8 @@ TEST_F(TransactionCoordinatorCatalogTest,
_coordinatorCatalog->get(operationContext(), lsid, txnNumberAndRetryCounter1);
coordinator1InCatalog->runCommit(operationContext(), kOneShardIdList);
assertCommandSentAndRespondWith("prepareTransaction", kNoSuchTransaction, boost::none);
+ coordinator1InCatalog->getDecision().wait();
+
createCoordinatorInCatalog(operationContext(), lsid, txnNumberAndRetryCounter2);
auto latestTxnNumberRetryCounterAndCoordinator =
diff --git a/src/mongo/db/s/transaction_coordinator_service_test.cpp b/src/mongo/db/s/transaction_coordinator_service_test.cpp
index c99cc39ec25..e1504a3cbe1 100644
--- a/src/mongo/db/s/transaction_coordinator_service_test.cpp
+++ b/src/mongo/db/s/transaction_coordinator_service_test.cpp
@@ -377,9 +377,16 @@ TEST_F(TransactionCoordinatorServiceTest,
coordinatorService->createCoordinator(
operationContext(), _lsid, _txnNumberAndRetryCounter, kCommitDeadline);
- auto completionFuture = coordinatorService->coordinateCommit(
- operationContext(), _lsid, _txnNumberAndRetryCounter, kOneShardIdSet);
- assertCommandSentAndRespondWith("prepareTransaction", kPrepareOk, boost::none);
+ {
+ // Set this server parameter so coordinateCommit returns the decision future instead of the
+ // completion future.
+ RAIIServerParameterControllerForTest _controller{
+ "coordinateCommitReturnImmediatelyAfterPersistingDecision", true};
+ auto decisionFuture = *coordinatorService->coordinateCommit(
+ operationContext(), _lsid, _txnNumberAndRetryCounter, kOneShardIdSet);
+ assertCommandSentAndRespondWith("prepareTransaction", kPrepareOk, boost::none);
+ decisionFuture.get();
+ }
TxnNumberAndRetryCounter otherTxnNumberAndRetryCounter{
_txnNumberAndRetryCounter.getTxnNumber(),
@@ -390,6 +397,8 @@ TEST_F(TransactionCoordinatorServiceTest,
AssertionException,
6032301);
+ auto completionFuture =
+ *coordinatorService->recoverCommit(operationContext(), _lsid, _txnNumberAndRetryCounter);
assertCommandSentAndRespondWith("commitTransaction", kOk, boost::none);
completionFuture.get();
}
@@ -642,7 +651,7 @@ TEST_F(TransactionCoordinatorServiceTest,
coordinatorService->createCoordinator(
operationContext(), _lsid, _txnNumberAndRetryCounter, kCommitDeadline);
- auto completionFuture = coordinatorService->coordinateCommit(
+ auto completionFuture = *coordinatorService->coordinateCommit(
operationContext(), _lsid, _txnNumberAndRetryCounter, kOneShardIdSet);
TxnNumberAndRetryCounter newTxnNumberAndRetryCounter{
@@ -655,7 +664,7 @@ TEST_F(TransactionCoordinatorServiceTest,
assertCommandSentAndRespondWith("prepareTransaction", kNoSuchTransaction, boost::none);
assertCommandSentAndRespondWith("abortTransaction", kOk, boost::none);
- completionFuture.get();
+ ASSERT_THROWS_CODE(completionFuture.get(), AssertionException, ErrorCodes::NoSuchTransaction);
}
TEST_F(TransactionCoordinatorServiceTest, CoordinatorRetriesOnWriteConcernErrorToPrepare) {