diff options
author | mathisbessamdb <mathis.bessa@mongodb.com> | 2022-03-25 22:19:24 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-03-25 23:15:28 +0000 |
commit | 26838030f0aedd4437effcb0418e5c4d6c53f538 (patch) | |
tree | bf3a2eb28c58a9d9c8901b52ed63da91455b8a91 /src/mongo/db/serverless | |
parent | 4dcb6069ca73344e0527102302410b96a241cd64 (diff) | |
download | mongo-26838030f0aedd4437effcb0418e5c4d6c53f538.tar.gz |
SERVER-64661 Fix validation on shutdown failing due to a re routing issue.
Diffstat (limited to 'src/mongo/db/serverless')
-rw-r--r-- | src/mongo/db/serverless/shard_split_donor_service_test.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/serverless/shard_split_utils.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/serverless/shard_split_utils.h | 3 |
3 files changed, 17 insertions, 7 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 5cb62f8b513..65abd349de0 100644 --- a/src/mongo/db/serverless/shard_split_donor_service_test.cpp +++ b/src/mongo/db/serverless/shard_split_donor_service_test.cpp @@ -505,7 +505,9 @@ TEST_F(SplitReplicaSetObserverTest, FutureReady) { ASSERT_FALSE(listener.getFuture().isReady()); listener.onServerHeartbeatSucceededEvent(host, BSON("setName" << _validRepl.getSetName())); } - + listener.onServerHeartbeatSucceededEvent( + _validRepl.getHosts().front(), + BSON("setName" << _validRepl.getSetName() << "ismaster" << true)); ASSERT_TRUE(listener.getFuture().isReady()); } @@ -524,6 +526,9 @@ TEST_F(SplitReplicaSetObserverTest, FutureReadyNameChange) { for (const auto& host : _validRepl.getHosts()) { listener.onServerHeartbeatSucceededEvent(host, BSON("setName" << _validRepl.getSetName())); } + listener.onServerHeartbeatSucceededEvent( + _validRepl.getHosts().front(), + BSON("setName" << _validRepl.getSetName() << "ismaster" << true)); ASSERT_TRUE(listener.getFuture().isReady()); } diff --git a/src/mongo/db/serverless/shard_split_utils.cpp b/src/mongo/db/serverless/shard_split_utils.cpp index 00910164810..966d9aa5e86 100644 --- a/src/mongo/db/serverless/shard_split_utils.cpp +++ b/src/mongo/db/serverless/shard_split_utils.cpp @@ -238,7 +238,7 @@ bool shouldRemoveStateDocumentOnRecipient(OperationContext* opCtx, auto recipientSetName = *stateDocument.getRecipientSetName(); auto config = repl::ReplicationCoordinator::get(cc().getServiceContext())->getConfig(); return recipientSetName == config.getReplSetName() && - stateDocument.getState() == ShardSplitDonorStateEnum::kBlocking; + stateDocument.getState() >= ShardSplitDonorStateEnum::kBlocking; } Status validateRecipientNodesForShardSplit(const ShardSplitDonorDocument& stateDocument, @@ -306,20 +306,24 @@ RecipientAcceptSplitListener::RecipientAcceptSplitListener( void RecipientAcceptSplitListener::onServerHeartbeatSucceededEvent(const HostAndPort& hostAndPort, const BSONObj reply) { - if (_fulfilled.load() || !reply["setName"]) { + stdx::lock_guard<Latch> lg(_mutex); + if (_fulfilled || !reply["setName"]) { return; } - stdx::lock_guard<Latch> lg(_mutex); _reportedSetNames[hostAndPort] = reply["setName"].str(); + if (!_hasPrimary && reply["ismaster"].booleanSafe()) { + _hasPrimary = true; + } + auto allReportCorrectly = std::all_of(_reportedSetNames.begin(), _reportedSetNames.end(), [&](const auto& entry) { return entry.second == _recipientSetName; }) && _reportedSetNames.size() == _numberOfRecipient; - if (allReportCorrectly) { - _fulfilled.store(true); + if (allReportCorrectly && _hasPrimary) { + _fulfilled = true; _promise.emplaceValue(); } } diff --git a/src/mongo/db/serverless/shard_split_utils.h b/src/mongo/db/serverless/shard_split_utils.h index e896f9f97cf..5949f1c8f32 100644 --- a/src/mongo/db/serverless/shard_split_utils.h +++ b/src/mongo/db/serverless/shard_split_utils.h @@ -140,10 +140,11 @@ private: mutable Mutex _mutex = MONGO_MAKE_LATCH("ShardSplitDonorService::getRecipientAcceptSplitFuture::_mutex"); - AtomicWord<bool> _fulfilled{false}; + bool _fulfilled{false}; const size_t _numberOfRecipient; std::string _recipientSetName; std::map<HostAndPort, std::string> _reportedSetNames; + bool _hasPrimary{false}; SharedPromise<void> _promise; }; |