diff options
author | Tommaso Tocci <tommaso.tocci@mongodb.com> | 2020-05-19 15:03:03 +0200 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-06-03 10:20:43 +0000 |
commit | fb12d9159efacf4a4de99d8068933fc647c79de8 (patch) | |
tree | 0b2f3ff18a00f223aeb29b411b3f647e181de9e3 | |
parent | ff99a2afe938bf7aec7e4bbfb0a922d7f70d6712 (diff) | |
download | mongo-fb12d9159efacf4a4de99d8068933fc647c79de8.tar.gz |
SERVER-48288 Remove 2nd CatalogCache used just for filtering
(cherry picked from commit b55528c5954b9d055e5cc55e2e7e58048f149208)
9 files changed, 20 insertions, 153 deletions
diff --git a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp index 088e59a088c..e5bd5cdba80 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp @@ -82,7 +82,6 @@ #include "mongo/db/s/migration_util.h" #include "mongo/db/s/periodic_balancer_config_refresher.h" #include "mongo/db/s/periodic_sharded_index_consistency_checker.h" -#include "mongo/db/s/shard_filtering_metadata_refresh.h" #include "mongo/db/s/sharding_initialization_mongod.h" #include "mongo/db/s/sharding_state_recovery.h" #include "mongo/db/s/transaction_coordinator_service.h" @@ -757,7 +756,7 @@ void ReplicationCoordinatorExternalStateImpl::shardingOnStepDownHook() { TransactionCoordinatorService::get(_service)->onStepDown(); } else if (ShardingState::get(_service)->enabled()) { ChunkSplitter::get(_service).onStepDown(); - getCatalogCacheLoaderForFiltering(_service).onStepDown(); + CatalogCacheLoader::get(_service).onStepDown(); PeriodicBalancerConfigRefresher::get(_service).onStepDown(); TransactionCoordinatorService::get(_service)->onStepDown(); } @@ -878,7 +877,7 @@ void ReplicationCoordinatorExternalStateImpl::_shardingOnTransitionToPrimaryHook ShardingInitializationMongoD::get(opCtx)->updateShardIdentityConfigString(opCtx, configsvrConnStr); - getCatalogCacheLoaderForFiltering(_service).onStepUp(); + CatalogCacheLoader::get(_service).onStepUp(); ChunkSplitter::get(_service).onStepUp(); PeriodicBalancerConfigRefresher::get(_service).onStepUp(_service); TransactionCoordinatorService::get(_service)->onStepUp(opCtx); diff --git a/src/mongo/db/s/flush_database_cache_updates_command.cpp b/src/mongo/db/s/flush_database_cache_updates_command.cpp index 2edba2ec7d2..4c06339fe38 100644 --- a/src/mongo/db/s/flush_database_cache_updates_command.cpp +++ b/src/mongo/db/s/flush_database_cache_updates_command.cpp @@ -141,7 +141,7 @@ public: forceDatabaseRefresh(opCtx, _dbName()); } - getCatalogCacheLoaderForFiltering(opCtx).waitForDatabaseFlush(opCtx, _dbName()); + CatalogCacheLoader::get(opCtx).waitForDatabaseFlush(opCtx, _dbName()); repl::ReplClientInfo::forClient(opCtx->getClient()).setLastOpToSystemLastOpTime(opCtx); } diff --git a/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp b/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp index 75ae37d3e32..1553b2b7079 100644 --- a/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp +++ b/src/mongo/db/s/flush_routing_table_cache_updates_command.cpp @@ -140,7 +140,7 @@ public: forceShardFilteringMetadataRefresh(opCtx, ns()); } - getCatalogCacheLoaderForFiltering(opCtx).waitForCollectionFlush(opCtx, ns()); + CatalogCacheLoader::get(opCtx).waitForCollectionFlush(opCtx, ns()); repl::ReplClientInfo::forClient(opCtx->getClient()).setLastOpToSystemLastOpTime(opCtx); } diff --git a/src/mongo/db/s/migration_source_manager.cpp b/src/mongo/db/s/migration_source_manager.cpp index 9f3b8ebc472..d45c7f0e1cd 100644 --- a/src/mongo/db/s/migration_source_manager.cpp +++ b/src/mongo/db/s/migration_source_manager.cpp @@ -759,7 +759,7 @@ void MigrationSourceManager::_cleanup() { // possible that the persisted metadata is rolled back after step down, but the write which // cleared the 'inMigration' flag is not, a secondary node will report itself at an older // shard version. - getCatalogCacheLoaderForFiltering(_opCtx).waitForCollectionFlush(_opCtx, getNss()); + CatalogCacheLoader::get(_opCtx).waitForCollectionFlush(_opCtx, getNss()); // Clear the 'minOpTime recovery' document so that the next time a node from this shard // becomes a primary, it won't have to recover the config server optime. diff --git a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp index efe9930137a..7585a81f398 100644 --- a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp +++ b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp @@ -36,15 +36,12 @@ #include "mongo/db/catalog/database_holder.h" #include "mongo/db/catalog_raii.h" #include "mongo/db/commands/feature_compatibility_version.h" -#include "mongo/db/commands/test_commands_enabled.h" #include "mongo/db/operation_context.h" #include "mongo/db/s/collection_sharding_runtime.h" #include "mongo/db/s/database_sharding_state.h" #include "mongo/db/s/operation_sharding_state.h" #include "mongo/db/s/sharding_state.h" #include "mongo/db/s/sharding_statistics.h" -#include "mongo/db/server_options.h" -#include "mongo/db/storage/storage_options.h" #include "mongo/logv2/log.h" #include "mongo/s/catalog_cache.h" #include "mongo/s/grid.h" @@ -132,63 +129,8 @@ void onDbVersionMismatch(OperationContext* opCtx, forceDatabaseRefresh(opCtx, dbName); } -const auto catalogCacheForFilteringDecoration = - ServiceContext::declareDecoration<std::unique_ptr<CatalogCache>>(); - -const auto catalogCacheLoaderForFilteringDecoration = - ServiceContext::declareDecoration<std::unique_ptr<CatalogCacheLoader>>(); - -CatalogCache& getCatalogCacheForFiltering(ServiceContext* serviceContext) { - if (hasAdditionalCatalogCacheForFiltering()) { - auto& catalogCacheForFiltering = catalogCacheForFilteringDecoration(serviceContext); - invariant(catalogCacheForFiltering); - return *catalogCacheForFiltering; - } - return *Grid::get(serviceContext)->catalogCache(); -} - -CatalogCache& getCatalogCacheForFiltering(OperationContext* opCtx) { - return getCatalogCacheForFiltering(opCtx->getServiceContext()); -} - } // namespace - -bool hasAdditionalCatalogCacheForFiltering() { - invariant(serverGlobalParams.clusterRole == ClusterRole::ShardServer); - return getTestCommandsEnabled() && !storageGlobalParams.readOnly; -} - -void setCatalogCacheForFiltering(ServiceContext* serviceContext, - std::unique_ptr<CatalogCache> catalogCache) { - invariant(hasAdditionalCatalogCacheForFiltering()); - auto& catalogCacheForFiltering = catalogCacheForFilteringDecoration(serviceContext); - invariant(!catalogCacheForFiltering); - catalogCacheForFiltering = std::move(catalogCache); -} - -void setCatalogCacheLoaderForFiltering(ServiceContext* serviceContext, - std::unique_ptr<CatalogCacheLoader> loader) { - invariant(hasAdditionalCatalogCacheForFiltering()); - auto& catalogCacheLoader = catalogCacheLoaderForFilteringDecoration(serviceContext); - invariant(!catalogCacheLoader); - catalogCacheLoader = std::move(loader); -} - -CatalogCacheLoader& getCatalogCacheLoaderForFiltering(ServiceContext* serviceContext) { - if (hasAdditionalCatalogCacheForFiltering()) { - auto& catalogCacheLoader = catalogCacheLoaderForFilteringDecoration(serviceContext); - invariant(catalogCacheLoader); - return *catalogCacheLoader; - } - return CatalogCacheLoader::get(serviceContext); -} - -CatalogCacheLoader& getCatalogCacheLoaderForFiltering(OperationContext* opCtx) { - return getCatalogCacheLoaderForFiltering(opCtx->getServiceContext()); -} - - Status onShardVersionMismatchNoExcept(OperationContext* opCtx, const NamespaceString& nss, ChunkVersion shardVersionReceived, @@ -215,15 +157,8 @@ ChunkVersion forceShardFilteringMetadataRefresh(OperationContext* opCtx, auto* const shardingState = ShardingState::get(opCtx); invariant(shardingState->canAcceptShardedCommands()); - if (hasAdditionalCatalogCacheForFiltering()) { - Grid::get(opCtx) - ->catalogCache() - ->getCollectionRoutingInfoWithRefresh(opCtx, nss, forceRefreshFromThisThread) - .getStatus() - .ignore(); - } auto routingInfo = - uassertStatusOK(getCatalogCacheForFiltering(opCtx).getCollectionRoutingInfoWithRefresh( + uassertStatusOK(Grid::get(opCtx)->catalogCache()->getCollectionRoutingInfoWithRefresh( opCtx, nss, forceRefreshFromThisThread)); auto cm = routingInfo.cm(); @@ -333,16 +268,8 @@ void forceDatabaseRefresh(OperationContext* opCtx, const StringData dbName) { DatabaseVersion refreshedDbVersion; try { - if (hasAdditionalCatalogCacheForFiltering()) { - Grid::get(opCtx) - ->catalogCache() - ->getDatabaseWithRefresh(opCtx, dbName) - .getStatus() - .ignore(); - } refreshedDbVersion = - uassertStatusOK( - getCatalogCacheForFiltering(opCtx).getDatabaseWithRefresh(opCtx, dbName)) + uassertStatusOK(Grid::get(opCtx)->catalogCache()->getDatabaseWithRefresh(opCtx, dbName)) .databaseVersion(); } catch (const ExceptionFor<ErrorCodes::NamespaceNotFound>&) { // db has been dropped, set the db version to boost::none diff --git a/src/mongo/db/s/shard_filtering_metadata_refresh.h b/src/mongo/db/s/shard_filtering_metadata_refresh.h index 7ca5cf1b992..f378c60622f 100644 --- a/src/mongo/db/s/shard_filtering_metadata_refresh.h +++ b/src/mongo/db/s/shard_filtering_metadata_refresh.h @@ -35,36 +35,9 @@ namespace mongo { -class CatalogCache; -class CatalogCacheLoader; -class ServiceContext; class OperationContext; /** - * Returns True when a separate CatalogCache must be used for filtering - */ -bool hasAdditionalCatalogCacheForFiltering(); - -/** - * CatalogCacheForFiltering is only used on a shard for obtaining the orphan filtering metadata - */ -void setCatalogCacheForFiltering(ServiceContext* serviceContext, - std::unique_ptr<CatalogCache> catalogCache); - - -/** - * CatalogCacheLoaderForFiltering is only used on a shard for obtaining the orphan filtering - * metadata - */ -void setCatalogCacheLoaderForFiltering(ServiceContext* serviceContext, - std::unique_ptr<CatalogCacheLoader> loader); - -// For routing use `CatalogCacheLoader::get()` -CatalogCacheLoader& getCatalogCacheLoaderForFiltering(ServiceContext* serviceContext); -CatalogCacheLoader& getCatalogCacheLoaderForFiltering(OperationContext* opCtx); - - -/** * Must be invoked whenever code, which is executing on a shard encounters a StaleConfig exception * and should be passed the 'version received' from the exception. If the shard's current version is * behind 'shardVersionReceived', causes the shard's filtering metadata to be refreshed from the diff --git a/src/mongo/db/s/shard_server_op_observer.cpp b/src/mongo/db/s/shard_server_op_observer.cpp index 09016626b0f..2ce1be4552c 100644 --- a/src/mongo/db/s/shard_server_op_observer.cpp +++ b/src/mongo/db/s/shard_server_op_observer.cpp @@ -43,7 +43,6 @@ #include "mongo/db/s/migration_util.h" #include "mongo/db/s/operation_sharding_state.h" #include "mongo/db/s/range_deletion_task_gen.h" -#include "mongo/db/s/shard_filtering_metadata_refresh.h" #include "mongo/db/s/shard_identity_rollback_notifier.h" #include "mongo/db/s/sharding_initialization_mongod.h" #include "mongo/db/s/sharding_state.h" @@ -81,7 +80,7 @@ public: void commit(boost::optional<Timestamp>) override { invariant(_opCtx->lockState()->isCollectionLockedForMode(_nss, MODE_IX)); - getCatalogCacheLoaderForFiltering(_opCtx).notifyOfCollectionVersionUpdate(_nss); + CatalogCacheLoader::get(_opCtx).notifyOfCollectionVersionUpdate(_nss); // Force subsequent uses of the namespace to refresh the filtering metadata so they can // synchronize with any work happening on the primary (e.g., migration critical section). diff --git a/src/mongo/db/s/sharding_initialization_mongod.cpp b/src/mongo/db/s/sharding_initialization_mongod.cpp index 989ccb56629..26a13840bff 100644 --- a/src/mongo/db/s/sharding_initialization_mongod.cpp +++ b/src/mongo/db/s/sharding_initialization_mongod.cpp @@ -50,7 +50,6 @@ #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" @@ -67,7 +66,6 @@ #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" namespace mongo { @@ -271,7 +269,7 @@ void ShardingInitializationMongoD::initializeShardingEnvironmentOnShardServer( bool isStandaloneOrPrimary = !isReplSet || (replCoord->getMemberState() == repl::MemberState::RS_PRIMARY); - getCatalogCacheLoaderForFiltering(opCtx).initializeReplicaSetRole(isStandaloneOrPrimary); + CatalogCacheLoader::get(opCtx).initializeReplicaSetRole(isStandaloneOrPrimary); ChunkSplitter::get(opCtx).onShardingInitialization(isStandaloneOrPrimary); PeriodicBalancerConfigRefresher::get(opCtx).onShardingInitialization(opCtx->getServiceContext(), isStandaloneOrPrimary); @@ -538,46 +536,17 @@ void initializeGlobalShardingStateForMongoD(OperationContext* opCtx, auto const service = opCtx->getServiceContext(); - - 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; + 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>())); } - }; - - CatalogCacheLoader::set(service, makeCatalogCacheLoader()); + } else { + CatalogCacheLoader::set(service, std::make_unique<ConfigServerCatalogCacheLoader>()); + } auto validator = LogicalTimeValidator::get(service); if (validator) { // The keyManager may be existing if the node was a part of a standalone RS. diff --git a/src/mongo/db/s/split_chunk_test.cpp b/src/mongo/db/s/split_chunk_test.cpp index 959ae425174..cfdc61f2b61 100644 --- a/src/mongo/db/s/split_chunk_test.cpp +++ b/src/mongo/db/s/split_chunk_test.cpp @@ -68,7 +68,7 @@ public: ShardServerTestFixture::setUp(); ShardingState::get(operationContext())->setInitialized(_shardId, OID::gen()); - getCatalogCacheLoaderForFiltering(getServiceContext()).initializeReplicaSetRole(true); + CatalogCacheLoader::get(getServiceContext()).initializeReplicaSetRole(true); // Instantiate names. _epoch = OID::gen(); |