summaryrefslogtreecommitdiff
path: root/src/mongo/db/serverless
diff options
context:
space:
mode:
authormathisbessamdb <mathis.bessa@mongodb.com>2022-03-25 22:19:24 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-25 23:15:28 +0000
commit26838030f0aedd4437effcb0418e5c4d6c53f538 (patch)
treebf3a2eb28c58a9d9c8901b52ed63da91455b8a91 /src/mongo/db/serverless
parent4dcb6069ca73344e0527102302410b96a241cd64 (diff)
downloadmongo-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.cpp7
-rw-r--r--src/mongo/db/serverless/shard_split_utils.cpp14
-rw-r--r--src/mongo/db/serverless/shard_split_utils.h3
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;
};