summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Oyung <anton.oyung@mongodb.com>2021-10-07 06:47:34 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-07 07:09:51 +0000
commit1fd7913b67d45874f1fde8f6297f4adf618e3d34 (patch)
tree6644730802ea7cfd731ef0dc7ee6131bfa395883
parent27a601deb8174aac0576a615fc6c4e3af3bfc932 (diff)
downloadmongo-1fd7913b67d45874f1fde8f6297f4adf618e3d34.tar.gz
SERVER-43985 Make mongos pre-cache the routing table on startup
-rw-r--r--buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml1
-rw-r--r--jstests/sharding/mongos_precache_routing_info.js35
-rw-r--r--src/mongo/s/server.cpp5
-rw-r--r--src/mongo/s/sharding_initialization.cpp27
-rw-r--r--src/mongo/s/sharding_initialization.h6
5 files changed, 74 insertions, 0 deletions
diff --git a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
index 0e4f771557f..d4b370f0704 100644
--- a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
+++ b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml
@@ -180,6 +180,7 @@ selector:
- jstests/sharding/time_zone_info_mongos.js
# Remove if/once SERVER-50547 is backported to 4.0.
- jstests/sharding/pipeline_length_limit.js
+ - jstests/sharding/mongos_precache_routing_info.js
- jstests/sharding/warm_up_connection_pool.js
executor:
diff --git a/jstests/sharding/mongos_precache_routing_info.js b/jstests/sharding/mongos_precache_routing_info.js
new file mode 100644
index 00000000000..3471f208e99
--- /dev/null
+++ b/jstests/sharding/mongos_precache_routing_info.js
@@ -0,0 +1,35 @@
+(function() {
+'use strict';
+
+// create
+var s = new ShardingTest({shards: 2});
+var db = s.getDB("test");
+var ss = db.serverStatus();
+
+const shardCommand = {
+ shardcollection: "test.foo",
+ key: {num: 1}
+};
+
+// shard
+assert.commandWorked(s.s0.adminCommand({enablesharding: "test"}));
+assert.commandWorked(s.s0.adminCommand(shardCommand));
+
+// split numSplits times
+const numSplits = 2;
+var i;
+for (i = 0; i < numSplits; i++) {
+ var midKey = {num: i};
+ assert.commandWorked(s.s0.adminCommand({split: "test.foo", middle: midKey}));
+}
+
+// restart mongos
+s.restartMongos(0);
+db = s.getDB("test");
+
+// check for # refreshes started
+ss = db.serverStatus();
+assert.eq(1, ss.shardingStatistics.catalogCache.countFullRefreshesStarted);
+
+s.stop();
+})();
diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp
index 3ac128f4794..15b2e0105a7 100644
--- a/src/mongo/s/server.cpp
+++ b/src/mongo/s/server.cpp
@@ -426,6 +426,11 @@ Status initializeSharding(OperationContext* opCtx) {
return status;
}
+ status = preCacheMongosRoutingInfo(opCtx);
+ if (!status.isOK()) {
+ return status;
+ }
+
status = preWarmConnectionPool(opCtx);
if (!status.isOK()) {
return status;
diff --git a/src/mongo/s/sharding_initialization.cpp b/src/mongo/s/sharding_initialization.cpp
index 4dc7372960e..6f090bbb4ab 100644
--- a/src/mongo/s/sharding_initialization.cpp
+++ b/src/mongo/s/sharding_initialization.cpp
@@ -270,6 +270,33 @@ Status waitForShardRegistryReload(OperationContext* opCtx) {
return {ErrorCodes::ShutdownInProgress, "aborting shard loading attempt"};
}
+Status preCacheMongosRoutingInfo(OperationContext* opCtx) {
+ if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) {
+ return Status::OK();
+ }
+ auto grid = Grid::get(opCtx);
+
+ auto shardingCatalogClient = grid->catalogClient();
+ auto result =
+ shardingCatalogClient->getAllDBs(opCtx, repl::ReadConcernLevel::kMajorityReadConcern);
+
+ if (!result.isOK()) {
+ return result.getStatus();
+ }
+
+ auto cache = grid->catalogCache();
+ for (auto& db : result.getValue().value) {
+ for (auto& coll : shardingCatalogClient->getAllShardedCollectionsForDb(
+ opCtx, db.getName(), repl::ReadConcernLevel::kMajorityReadConcern)) {
+ auto resp = cache->getShardedCollectionRoutingInfoWithRefresh(opCtx, coll);
+ if (!resp.isOK()) {
+ return resp.getStatus();
+ }
+ }
+ }
+ return Status::OK();
+}
+
Status preWarmConnectionPool(OperationContext* opCtx) {
if (!gWarmMinConnectionsInShardingTaskExecutorPoolOnStartup) {
return Status::OK();
diff --git a/src/mongo/s/sharding_initialization.h b/src/mongo/s/sharding_initialization.h
index 56c5f652ddd..5af0cc6f265 100644
--- a/src/mongo/s/sharding_initialization.h
+++ b/src/mongo/s/sharding_initialization.h
@@ -90,6 +90,12 @@ Status initializeGlobalShardingState(OperationContext* opCtx,
Status waitForShardRegistryReload(OperationContext* opCtx);
/**
+ * Pre-caches mongod routing info for the calling process.
+ */
+
+Status preCacheMongosRoutingInfo(OperationContext* opCtx);
+
+/**
* Warms up connections to shards with best effort strategy.
*/