summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/transaction_coordinator_service_test.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2019-03-28 13:19:22 -0400
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2019-04-03 16:48:29 -0400
commitfecb661b5ebfe1c5e8265db34abc240004d55bf0 (patch)
tree38b51bce970c92cae00534effcf9905483c057c0 /src/mongo/db/s/transaction_coordinator_service_test.cpp
parent7575dac4abe7d5c6164b54487a81771cd3aad644 (diff)
downloadmongo-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.cpp41
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()));
}