diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2019-03-28 13:19:22 -0400 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2019-04-03 16:48:29 -0400 |
commit | fecb661b5ebfe1c5e8265db34abc240004d55bf0 (patch) | |
tree | 38b51bce970c92cae00534effcf9905483c057c0 /src/mongo/db/s/transaction_coordinator_service_test.cpp | |
parent | 7575dac4abe7d5c6164b54487a81771cd3aad644 (diff) | |
download | mongo-fecb661b5ebfe1c5e8265db34abc240004d55bf0.tar.gz |
SERVER-37881 Add a deadline for the coordinator preparing a transaction
Diffstat (limited to 'src/mongo/db/s/transaction_coordinator_service_test.cpp')
-rw-r--r-- | src/mongo/db/s/transaction_coordinator_service_test.cpp | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/mongo/db/s/transaction_coordinator_service_test.cpp b/src/mongo/db/s/transaction_coordinator_service_test.cpp index 7206cfb6be9..128a574c79c 100644 --- a/src/mongo/db/s/transaction_coordinator_service_test.cpp +++ b/src/mongo/db/s/transaction_coordinator_service_test.cpp @@ -609,8 +609,7 @@ TEST_F(TransactionCoordinatorServiceTest, operationContext(), _lsid, _txnNumber, kTwoShardIdSet)); } -TEST_F(TransactionCoordinatorServiceTest, - CoordinatorIsNotCanceledIfDeadlinePassesButHasReceivedParticipantList) { +TEST_F(TransactionCoordinatorServiceTest, CoordinatorAbortsIfDeadlinePassesAndStillPreparing) { auto coordinatorService = TransactionCoordinatorService::get(operationContext()); const auto deadline = executor()->now() + Milliseconds(1000 * 60 * 10 /* 10 hours */); coordinatorService->createCoordinator(operationContext(), _lsid, _txnNumber, deadline); @@ -626,9 +625,47 @@ TEST_F(TransactionCoordinatorServiceTest, network()->exitNetwork(); // The coordinator should still exist. + auto commitDecisionFuture = + coordinatorService->coordinateCommit(operationContext(), _lsid, _txnNumber, kTwoShardIdSet); + ASSERT(boost::none != commitDecisionFuture); + + // ... and should run the abort sequence + assertAbortSentAndRespondWithSuccess(); + assertAbortSentAndRespondWithSuccess(); + + ASSERT_EQ(int(txn::CommitDecision::kAbort), int(commitDecisionFuture->get())); +} + +TEST_F(TransactionCoordinatorServiceTest, + CoordinatorContinuesCommittingIfDeadlinePassesAndCommitWasDecided) { + auto coordinatorService = TransactionCoordinatorService::get(operationContext()); + const auto deadline = executor()->now() + Milliseconds(1000 * 60 * 10 /* 10 hours */); + coordinatorService->createCoordinator(operationContext(), _lsid, _txnNumber, deadline); + + // Deliver the participant list before the deadline. ASSERT(boost::none != coordinatorService->coordinateCommit( operationContext(), _lsid, _txnNumber, kTwoShardIdSet)); + + // Vote commit before the deadline + onCommands({[&](const executor::RemoteCommandRequest&) { return kPrepareOk; }, + [&](const executor::RemoteCommandRequest&) { return kPrepareOk; }}); + + // Reach the deadline. + network()->enterNetwork(); + network()->advanceTime(deadline); + network()->exitNetwork(); + + // The coordinator should still exist. + auto commitDecisionFuture = + coordinatorService->coordinateCommit(operationContext(), _lsid, _txnNumber, kTwoShardIdSet); + ASSERT(boost::none != commitDecisionFuture); + + // ... and should run the commit sequence + assertCommitSentAndRespondWithSuccess(); + assertCommitSentAndRespondWithSuccess(); + + ASSERT_EQ(int(txn::CommitDecision::kCommit), int(commitDecisionFuture->get())); } |