summaryrefslogtreecommitdiff
path: root/src/mongo/db/serverless/shard_split_utils.cpp
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/shard_split_utils.cpp
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/shard_split_utils.cpp')
-rw-r--r--src/mongo/db/serverless/shard_split_utils.cpp14
1 files changed, 9 insertions, 5 deletions
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();
}
}