diff options
author | Anton Oyung <anton.oyung@mongodb.com> | 2021-10-07 06:47:34 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-07 07:09:51 +0000 |
commit | 1fd7913b67d45874f1fde8f6297f4adf618e3d34 (patch) | |
tree | 6644730802ea7cfd731ef0dc7ee6131bfa395883 | |
parent | 27a601deb8174aac0576a615fc6c4e3af3bfc932 (diff) | |
download | mongo-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.yml | 1 | ||||
-rw-r--r-- | jstests/sharding/mongos_precache_routing_info.js | 35 | ||||
-rw-r--r-- | src/mongo/s/server.cpp | 5 | ||||
-rw-r--r-- | src/mongo/s/sharding_initialization.cpp | 27 | ||||
-rw-r--r-- | src/mongo/s/sharding_initialization.h | 6 |
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. */ |