summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTommaso Tocci <tommaso.tocci@mongodb.com>2020-10-08 13:08:28 +0200
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-10-11 13:24:44 +0000
commitbd1f707b4e981aeea09d3a0e0774973b9c223eb2 (patch)
treebe0826b7adce74d007ced8fd87dda281016a43db
parent7fcbd7c28648e444e108bd9e4b64e32deef9ca77 (diff)
downloadmongo-bd1f707b4e981aeea09d3a0e0774973b9c223eb2.tar.gz
SERVER-51342 ShardRegistry should forget connection strings of removed shards
-rw-r--r--src/mongo/s/client/shard_registry.cpp6
-rw-r--r--src/mongo/s/client/shard_registry.h2
2 files changed, 8 insertions, 0 deletions
diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp
index d1689d672c7..b19f5d7d77b 100644
--- a/src/mongo/s/client/shard_registry.cpp
+++ b/src/mongo/s/client/shard_registry.cpp
@@ -194,6 +194,7 @@ ShardRegistry::Cache::LookupResult ShardRegistry::_lookup(OperationContext* opCt
auto name = shard->getConnString().getSetName();
ReplicaSetMonitor::remove(name);
+ _removeReplicaSet(name);
for (auto& callback : _shardRemovalHooks) {
// Run callbacks asynchronously.
// TODO SERVER-50906: Consider running these callbacks synchronously.
@@ -375,6 +376,11 @@ ShardRegistry::_getLatestConnStrings() const {
return {{_latestConnStrings.begin(), _latestConnStrings.end()}, _rsmIncrement.load()};
}
+void ShardRegistry::_removeReplicaSet(const std::string& setName) {
+ stdx::lock_guard<Latch> lk(_mutex);
+ _latestConnStrings.erase(setName);
+}
+
void ShardRegistry::updateReplSetHosts(const ConnectionString& givenConnString,
ConnectionStringUpdateType updateType) {
invariant(givenConnString.type() == ConnectionString::SET ||
diff --git a/src/mongo/s/client/shard_registry.h b/src/mongo/s/client/shard_registry.h
index c990c4b3069..7a21be7858a 100644
--- a/src/mongo/s/client/shard_registry.h
+++ b/src/mongo/s/client/shard_registry.h
@@ -428,6 +428,8 @@ private:
std::pair<std::vector<LatestConnStrings::value_type>, Increment> _getLatestConnStrings() const;
+ void _removeReplicaSet(const std::string& setName);
+
void _initializeCacheIfNecessary() const;
void _periodicReload(const executor::TaskExecutor::CallbackArgs& cbArgs);