diff options
Diffstat (limited to 'src/mongo/db/s/sharding_initialization_mongod.cpp')
-rw-r--r-- | src/mongo/db/s/sharding_initialization_mongod.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/src/mongo/db/s/sharding_initialization_mongod.cpp b/src/mongo/db/s/sharding_initialization_mongod.cpp index 7c81c06766c..24100e2d682 100644 --- a/src/mongo/db/s/sharding_initialization_mongod.cpp +++ b/src/mongo/db/s/sharding_initialization_mongod.cpp @@ -49,6 +49,7 @@ #include "mongo/db/s/chunk_splitter.h" #include "mongo/db/s/periodic_balancer_config_refresher.h" #include "mongo/db/s/read_only_catalog_cache_loader.h" +#include "mongo/db/s/shard_filtering_metadata_refresh.h" #include "mongo/db/s/shard_server_catalog_cache_loader.h" #include "mongo/db/s/sharding_config_optime_gossip.h" #include "mongo/db/s/transaction_coordinator_service.h" @@ -64,6 +65,7 @@ #include "mongo/s/config_server_catalog_cache_loader.h" #include "mongo/s/grid.h" #include "mongo/s/sharding_initialization.h" +#include "mongo/util/exit.h" #include "mongo/util/log.h" namespace mongo { @@ -165,7 +167,7 @@ void ShardingInitializationMongoD::initializeShardingEnvironmentOnShardServer( bool isStandaloneOrPrimary = !isReplSet || (replCoord->getMemberState() == repl::MemberState::RS_PRIMARY); - CatalogCacheLoader::get(opCtx).initializeReplicaSetRole(isStandaloneOrPrimary); + getCatalogCacheLoaderForFiltering(opCtx).initializeReplicaSetRole(isStandaloneOrPrimary); ChunkSplitter::get(opCtx).onShardingInitialization(isStandaloneOrPrimary); PeriodicBalancerConfigRefresher::get(opCtx).onShardingInitialization(opCtx->getServiceContext(), isStandaloneOrPrimary); @@ -410,18 +412,47 @@ void initializeGlobalShardingStateForMongoD(OperationContext* opCtx, auto const service = opCtx->getServiceContext(); - if (serverGlobalParams.clusterRole == ClusterRole::ShardServer) { - if (storageGlobalParams.readOnly) { - CatalogCacheLoader::set(service, std::make_unique<ReadOnlyCatalogCacheLoader>()); - } else { - CatalogCacheLoader::set(service, - std::make_unique<ShardServerCatalogCacheLoader>( - std::make_unique<ConfigServerCatalogCacheLoader>())); - } - } else { - CatalogCacheLoader::set(service, std::make_unique<ConfigServerCatalogCacheLoader>()); + + if (serverGlobalParams.clusterRole == ClusterRole::ShardServer && + hasAdditionalCatalogCacheForFiltering()) { + // Setup additional CatalogCache for filtering only + setCatalogCacheLoaderForFiltering(service, + std::make_unique<ShardServerCatalogCacheLoader>( + std::make_unique<ConfigServerCatalogCacheLoader>())); + setCatalogCacheForFiltering( + service, std::make_unique<CatalogCache>(getCatalogCacheLoaderForFiltering(opCtx))); + registerShutdownTask( + [service]() { getCatalogCacheLoaderForFiltering(service).shutDown(); }); } + // Make primary CatalogCacheLoader according to the cluster Role + auto makeCatalogCacheLoader = []() -> std::unique_ptr<CatalogCacheLoader> { + switch (serverGlobalParams.clusterRole) { + case ClusterRole::ShardServer: + if (storageGlobalParams.readOnly) { + return std::make_unique<ReadOnlyCatalogCacheLoader>(); + } + if (hasAdditionalCatalogCacheForFiltering()) { + // The primary CatalogCache will be used only for routing + return std::make_unique<ConfigServerCatalogCacheLoader>(); + } + + // Normal ShardServer without additional cache for filtering + return std::make_unique<ShardServerCatalogCacheLoader>( + std::make_unique<ConfigServerCatalogCacheLoader>()); + break; + + case ClusterRole::ConfigServer: + return std::make_unique<ConfigServerCatalogCacheLoader>(); + break; + + default: + MONGO_UNREACHABLE; + } + }; + + CatalogCacheLoader::set(service, makeCatalogCacheLoader()); + auto validator = LogicalTimeValidator::get(service); if (validator) { // The keyManager may be existing if the node was a part of a standalone RS. validator->stopKeyManager(); |