summaryrefslogtreecommitdiff
path: root/src/mongo/db/serverless/shard_split_donor_service_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/serverless/shard_split_donor_service_test.cpp')
-rw-r--r--src/mongo/db/serverless/shard_split_donor_service_test.cpp97
1 files changed, 49 insertions, 48 deletions
diff --git a/src/mongo/db/serverless/shard_split_donor_service_test.cpp b/src/mongo/db/serverless/shard_split_donor_service_test.cpp
index 415ddbace97..069c4926fb3 100644
--- a/src/mongo/db/serverless/shard_split_donor_service_test.cpp
+++ b/src/mongo/db/serverless/shard_split_donor_service_test.cpp
@@ -231,6 +231,8 @@ protected:
};
TEST_F(ShardSplitDonorServiceTest, BasicShardSplitDonorServiceInstanceCreation) {
+ FailPointEnableBlock fp("skipShardSplitWaitForSplitAcceptance");
+
auto opCtx = makeOperationContext();
test::shard_split::ScopedTenantAccessBlocker scopedTenants(_tenantIds, opCtx.get());
test::shard_split::reconfigToAddRecipientNodes(
@@ -279,6 +281,9 @@ TEST_F(ShardSplitDonorServiceTest, BasicShardSplitDonorServiceInstanceCreation)
}
TEST_F(ShardSplitDonorServiceTest, ShardSplitDonorServiceTimeout) {
+ FailPointEnableBlock fp("pauseShardSplitAfterBlocking");
+ FailPointEnableBlock fp2("skipShardSplitWaitForSplitAcceptance");
+
auto opCtx = makeOperationContext();
auto serviceContext = getServiceContext();
test::shard_split::ScopedTenantAccessBlocker scopedTenants(_tenantIds, opCtx.get());
@@ -509,75 +514,71 @@ protected:
std::string _recipientSetName{_validRepl.getURI().getSetName()};
};
-TEST_F(SplitReplicaSetObserverTest, SupportsCancellation) {
- test::shard_split::reconfigToAddRecipientNodes(
- getServiceContext(), _recipientTagName, _validRepl.getHosts(), _recipientSet.getHosts());
-
- CancellationSource source;
- auto future = detail::makeRecipientAcceptSplitFuture(
- _executor, source.token(), _recipientTagName, _recipientSetName);
+TEST_F(SplitReplicaSetObserverTest, FutureReady) {
+ auto listener =
+ mongo::serverless::RecipientAcceptSplitListener(_validRepl.getURI().connectionString());
- ASSERT_FALSE(future.isReady());
- source.cancel();
+ for (const auto& host : _validRepl.getHosts()) {
+ ASSERT_FALSE(listener.getFuture().isReady());
+ listener.onServerHeartbeatSucceededEvent(host, BSON("setName" << _validRepl.getSetName()));
+ }
- ASSERT_EQ(future.getNoThrow().code(), ErrorCodes::CallbackCanceled);
+ ASSERT_TRUE(listener.getFuture().isReady());
}
-TEST_F(SplitReplicaSetObserverTest, GetRecipientAcceptSplitFutureTest) {
- test::shard_split::reconfigToAddRecipientNodes(
- getServiceContext(), _recipientTagName, _validRepl.getHosts(), _recipientSet.getHosts());
+TEST_F(SplitReplicaSetObserverTest, FutureReadyNameChange) {
+ auto listener =
+ mongo::serverless::RecipientAcceptSplitListener(_validRepl.getURI().connectionString());
- CancellationSource source;
- auto future = detail::makeRecipientAcceptSplitFuture(
- _executor, source.token(), _recipientTagName, _recipientSetName);
+ for (const auto& host : _validRepl.getHosts()) {
+ listener.onServerHeartbeatSucceededEvent(host,
+ BSON("setName"
+ << "donorSetName"));
+ }
- std::shared_ptr<TopologyDescription> topologyDescriptionOld =
- std::make_shared<sdam::TopologyDescription>(sdam::SdamConfiguration());
- std::shared_ptr<TopologyDescription> topologyDescriptionNew =
- makeRecipientTopologyDescription(_validRepl);
+ ASSERT_FALSE(listener.getFuture().isReady());
- _publisher->onTopologyDescriptionChangedEvent(topologyDescriptionOld, topologyDescriptionNew);
+ for (const auto& host : _validRepl.getHosts()) {
+ listener.onServerHeartbeatSucceededEvent(host, BSON("setName" << _validRepl.getSetName()));
+ }
- future.wait();
+ ASSERT_TRUE(listener.getFuture().isReady());
}
TEST_F(SplitReplicaSetObserverTest, FutureNotReadyMissingNodes) {
- auto predicate =
- detail::makeRecipientAcceptSplitPredicate(_validRepl.getURI().connectionString());
+ auto listener =
+ mongo::serverless::RecipientAcceptSplitListener(_validRepl.getURI().connectionString());
- std::shared_ptr<TopologyDescription> topologyDescriptionNew =
- makeRecipientTopologyDescription(_validRepl);
- topologyDescriptionNew->removeServerDescription(_validRepl.getHosts()[0]);
+ for (size_t i = 0; i < _validRepl.getHosts().size() - 1; ++i) {
+ listener.onServerHeartbeatSucceededEvent(_validRepl.getHosts()[i],
+ BSON("setName" << _validRepl.getSetName()));
+ }
- ASSERT_FALSE(predicate(topologyDescriptionNew->getServers()));
+ ASSERT_FALSE(listener.getFuture().isReady());
}
-TEST_F(SplitReplicaSetObserverTest, FutureNotReadyWrongSet) {
- auto predicate =
- detail::makeRecipientAcceptSplitPredicate(_validRepl.getURI().connectionString());
+TEST_F(SplitReplicaSetObserverTest, FutureNotReadyNoSetName) {
+ auto listener =
+ mongo::serverless::RecipientAcceptSplitListener(_validRepl.getURI().connectionString());
- std::shared_ptr<TopologyDescription> topologyDescriptionNew =
- makeRecipientTopologyDescription(_invalidRepl);
+ for (size_t i = 0; i < _validRepl.getHosts().size() - 1; ++i) {
+ listener.onServerHeartbeatSucceededEvent(_validRepl.getHosts()[i], BSONObj());
+ }
- ASSERT_FALSE(predicate(topologyDescriptionNew->getServers()));
+ ASSERT_FALSE(listener.getFuture().isReady());
}
-TEST_F(SplitReplicaSetObserverTest, ExecutorCanceled) {
- test::shard_split::reconfigToAddRecipientNodes(
- getServiceContext(), _recipientTagName, _validRepl.getHosts(), _recipientSet.getHosts());
-
- CancellationSource source;
- auto future = detail::makeRecipientAcceptSplitFuture(
- _executor, source.token(), _recipientTagName, _recipientSetName);
-
- _executor->shutdown();
- _executor->join();
+TEST_F(SplitReplicaSetObserverTest, FutureNotReadyWrongSet) {
+ auto listener =
+ mongo::serverless::RecipientAcceptSplitListener(_validRepl.getURI().connectionString());
- ASSERT_FALSE(future.isReady());
+ for (const auto& host : _validRepl.getHosts()) {
+ listener.onServerHeartbeatSucceededEvent(host,
+ BSON("setName"
+ << "wrongSetName"));
+ }
- // Ensure the test does not hang.
- source.cancel();
- ASSERT_EQ(future.getNoThrow().code(), ErrorCodes::ShutdownInProgress);
+ ASSERT_FALSE(listener.getFuture().isReady());
}
class ShardSplitRecipientCleanupTest : public ShardSplitDonorServiceTest {