diff options
Diffstat (limited to 'src/mongo/db/transaction_coordinator_test.cpp')
-rw-r--r-- | src/mongo/db/transaction_coordinator_test.cpp | 112 |
1 files changed, 42 insertions, 70 deletions
diff --git a/src/mongo/db/transaction_coordinator_test.cpp b/src/mongo/db/transaction_coordinator_test.cpp index 6f154b3268b..458ff30244e 100644 --- a/src/mongo/db/transaction_coordinator_test.cpp +++ b/src/mongo/db/transaction_coordinator_test.cpp @@ -34,135 +34,107 @@ #include <future> +#include "mongo/db/service_context_d_test_fixture.h" #include "mongo/unittest/unittest.h" namespace mongo { +namespace { + using State = TransactionCoordinator::StateMachine::State; +using Coordinator = ServiceContextMongoDTest; const Timestamp dummyTimestamp = Timestamp::min(); -TEST(Coordinator, SomeParticipantVotesAbortLeadsToAbort) { - TransactionCoordinator coordinator; - coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteAbort(ShardId("shard0000")); - coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); - ASSERT_EQ(State::kAborted, coordinator.state()); +void doCommit(TransactionCoordinator& coordinator) { + coordinator.recvCoordinateCommit({ShardId("shard0000")}); + coordinator.madeParticipantListDurable(); + coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); + coordinator.madeCommitDecisionDurable(); + coordinator.recvCommitAck(ShardId("shard0000")); } -TEST(Coordinator, SomeParticipantsVoteAbortBeforeCoordinatorReceivesParticipantListLeadsToAbort) { - TransactionCoordinator coordinator; +void doAbort(TransactionCoordinator& coordinator) { + coordinator.recvCoordinateCommit({ShardId("shard0000")}); + coordinator.madeParticipantListDurable(); coordinator.recvVoteAbort(ShardId("shard0000")); - coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); - ASSERT_EQ(State::kAborted, coordinator.state()); + coordinator.madeAbortDecisionDurable(); + coordinator.recvAbortAck(ShardId("shard0000")); +} } -TEST(Coordinator, AllParticipantsVoteCommitLeadsToCommit) { +TEST_F(Coordinator, SomeParticipantVotesAbortLeadsToAbort) { TransactionCoordinator coordinator; coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); + coordinator.madeParticipantListDurable(); + coordinator.recvVoteAbort(ShardId("shard0000")); coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); - coordinator.recvCommitAck(ShardId("shard0000")); - coordinator.recvCommitAck(ShardId("shard0001")); - ASSERT_EQ(State::kCommitted, coordinator.state()); + coordinator.madeAbortDecisionDurable(); + coordinator.recvAbortAck(ShardId("shard0001")); + ASSERT_EQ(State::kAborted, coordinator.state()); } -TEST( - Coordinator, - AllParticipantsVoteCommitSomeParticipantsVoteBeforeCoordinatorReceivesParticipantListLeadsToCommit) { +TEST_F(Coordinator, AllParticipantsVoteCommitLeadsToCommit) { TransactionCoordinator coordinator; - coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); + coordinator.madeParticipantListDurable(); + coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); + coordinator.madeCommitDecisionDurable(); coordinator.recvCommitAck(ShardId("shard0000")); coordinator.recvCommitAck(ShardId("shard0001")); ASSERT_EQ(State::kCommitted, coordinator.state()); } -TEST(Coordinator, NotHearingSomeParticipantsVoteOtherParticipantsVotedCommitLeadsToStillWaiting) { +TEST_F(Coordinator, NotHearingSomeParticipantsVoteOtherParticipantsVotedCommitLeadsToStillWaiting) { TransactionCoordinator coordinator; coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); + coordinator.madeParticipantListDurable(); coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); ASSERT_EQ(State::kWaitingForVotes, coordinator.state()); } -TEST(Coordinator, NotHearingSomeParticipantsVoteAnotherParticipantVotedAbortLeadsToAbort) { +TEST_F(Coordinator, NotHearingSomeParticipantsVoteAnotherParticipantVotedAbortLeadsToAbort) { TransactionCoordinator coordinator; coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); + coordinator.madeParticipantListDurable(); coordinator.recvVoteAbort(ShardId("shard0000")); - ASSERT_EQ(State::kAborted, coordinator.state()); + ASSERT_EQ(State::kMakingAbortDecisionDurable, coordinator.state()); } -TEST(Coordinator, NotHearingSomeParticipantsCommitAckLeadsToStillWaiting) { +TEST_F(Coordinator, NotHearingSomeParticipantsCommitAckLeadsToStillWaiting) { TransactionCoordinator coordinator; coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); + coordinator.madeParticipantListDurable(); coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); + coordinator.madeCommitDecisionDurable(); coordinator.recvCommitAck(ShardId("shard0000")); ASSERT_EQ(State::kWaitingForCommitAcks, coordinator.state()); } -TEST(Coordinator, TryAbortWhileWaitingForParticipantListSuccessfullyAborts) { - TransactionCoordinator coordinator; - coordinator.recvTryAbort(); - ASSERT_EQ(State::kAborted, coordinator.state()); -} - -TEST(Coordinator, TryAbortWhileWaitingForVotesSuccessfullyAborts) { - TransactionCoordinator coordinator; - coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); - coordinator.recvTryAbort(); - ASSERT_EQ(State::kAborted, coordinator.state()); -} - -TEST(Coordinator, TryAbortWhileWaitingForCommitAcksDoesNotCancelCommit) { - TransactionCoordinator coordinator; - coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); - coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); - ASSERT_EQ(State::kWaitingForCommitAcks, coordinator.state()); - coordinator.recvTryAbort(); - ASSERT_EQ(State::kWaitingForCommitAcks, coordinator.state()); - coordinator.recvCommitAck(ShardId("shard0000")); - coordinator.recvCommitAck(ShardId("shard0001")); - ASSERT_EQ(State::kCommitted, coordinator.state()); -} - -TEST(Coordinator, VoteCommitToAbortedCoordinatorRespondsWithAbort) { - TransactionCoordinator coordinator; - coordinator.recvCoordinateCommit({ShardId("shard0000"), ShardId("shard0001")}); - coordinator.recvVoteAbort(ShardId("shard0000")); - ASSERT_EQ(State::kAborted, coordinator.state()); - auto action = coordinator.recvVoteCommit(ShardId("shard0001"), dummyTimestamp); - ASSERT_EQ(TransactionCoordinator::StateMachine::Action::kSendAbort, action); -} - -TEST(Coordinator, WaitForCompletionReturnsOnChangeToCommitted) { +TEST_F(Coordinator, WaitForCompletionReturnsOnChangeToCommitted) { TransactionCoordinator coordinator; auto future = coordinator.waitForCompletion(); - coordinator.recvCoordinateCommit({ShardId("shard0000")}); - coordinator.recvVoteCommit(ShardId("shard0000"), dummyTimestamp); - coordinator.recvCommitAck(ShardId("shard0000")); + doCommit(coordinator); auto finalState = future.get(); ASSERT_EQ(finalState, TransactionCoordinator::StateMachine::State::kCommitted); } -TEST(Coordinator, WaitForCompletionReturnsOnChangeToAborted) { +TEST_F(Coordinator, WaitForCompletionReturnsOnChangeToAborted) { TransactionCoordinator coordinator; auto future = coordinator.waitForCompletion(); - coordinator.recvVoteAbort(ShardId("shard0000")); + doAbort(coordinator); auto finalState = future.get(); ASSERT_EQ(finalState, TransactionCoordinator::StateMachine::State::kAborted); } -TEST(Coordinator, RepeatedCallsToWaitForCompletionAllReturn) { +TEST_F(Coordinator, RepeatedCallsToWaitForCompletionAllReturn) { TransactionCoordinator coordinator; auto futures = {coordinator.waitForCompletion(), coordinator.waitForCompletion(), coordinator.waitForCompletion()}; - coordinator.recvVoteAbort(ShardId("shard0000")); + doAbort(coordinator); for (auto& future : futures) { auto finalState = future.get(); @@ -170,9 +142,9 @@ TEST(Coordinator, RepeatedCallsToWaitForCompletionAllReturn) { } } -TEST(Coordinator, CallingWaitForCompletionAfterAlreadyCompleteReturns) { +TEST_F(Coordinator, CallingWaitForCompletionAfterAlreadyCompleteReturns) { TransactionCoordinator coordinator; - coordinator.recvVoteAbort(ShardId("shard0000")); + doAbort(coordinator); auto future = coordinator.waitForCompletion(); auto finalState = future.get(); |