summaryrefslogtreecommitdiff
path: root/src/mongo/db/serverless/shard_split_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/serverless/shard_split_utils.cpp')
-rw-r--r--src/mongo/db/serverless/shard_split_utils.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mongo/db/serverless/shard_split_utils.cpp b/src/mongo/db/serverless/shard_split_utils.cpp
index f2db7aaf4d1..16e9b7f5a59 100644
--- a/src/mongo/db/serverless/shard_split_utils.cpp
+++ b/src/mongo/db/serverless/shard_split_utils.cpp
@@ -238,5 +238,34 @@ bool shouldRemoveStateDocumentOnRecipient(OperationContext* opCtx,
stateDocument.getState() == ShardSplitDonorStateEnum::kBlocking;
}
+RecipientAcceptSplitListener::RecipientAcceptSplitListener(
+ const ConnectionString& recipientConnectionString)
+ : _numberOfRecipient(recipientConnectionString.getServers().size()),
+ _recipientSetName(recipientConnectionString.getSetName()) {}
+
+void RecipientAcceptSplitListener::onServerHeartbeatSucceededEvent(const HostAndPort& hostAndPort,
+ const BSONObj reply) {
+ if (_fulfilled.load() || !reply["setName"]) {
+ return;
+ }
+
+ stdx::lock_guard<Latch> lg(_mutex);
+ _reportedSetNames[hostAndPort] = reply["setName"].str();
+
+ auto allReportCorrectly =
+ std::all_of(_reportedSetNames.begin(),
+ _reportedSetNames.end(),
+ [&](const auto& entry) { return entry.second == _recipientSetName; }) &&
+ _reportedSetNames.size() == _numberOfRecipient;
+ if (allReportCorrectly) {
+ _fulfilled.store(true);
+ _promise.emplaceValue();
+ }
+}
+
+SharedSemiFuture<void> RecipientAcceptSplitListener::getFuture() const {
+ return _promise.getFuture();
+}
+
} // namespace serverless
} // namespace mongo