diff options
author | Antonio Fuschetto <antonio.fuschetto@mongodb.com> | 2022-09-14 15:59:22 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-09-15 07:42:06 +0000 |
commit | aa8a3126a2857f235a14aca96cdcd897e42990cf (patch) | |
tree | a0514d8f4ffb62f6a41db4fa43dcbd500eb994e6 | |
parent | 2eebadf82faa58ac5aebc9e8238c7b299e316a7d (diff) | |
download | mongo-aa8a3126a2857f235a14aca96cdcd897e42990cf.tar.gz |
SERVER-69108 SCCL can immediately return config and admin metadata without triggering a refresh
-rw-r--r-- | src/mongo/db/s/flush_database_cache_updates_command.cpp | 45 | ||||
-rw-r--r-- | src/mongo/db/s/shard_filtering_metadata_refresh.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/s/shard_server_catalog_cache_loader.cpp | 8 |
3 files changed, 57 insertions, 0 deletions
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 cf4a033f668..39c24528a40 100644 --- a/src/mongo/db/s/flush_database_cache_updates_command.cpp +++ b/src/mongo/db/s/flush_database_cache_updates_command.cpp @@ -38,6 +38,7 @@ #include "mongo/db/catalog_raii.h" #include "mongo/db/client.h" #include "mongo/db/commands.h" +#include "mongo/db/dbdirectclient.h" #include "mongo/db/operation_context.h" #include "mongo/db/repl/repl_client_info.h" #include "mongo/db/s/database_sharding_state.h" @@ -55,6 +56,30 @@ namespace mongo { namespace { +/** + * Inserts a database collection entry with fixed metadata for the `config` or `admin` database. If + * the entry key already exists, it's not updated. + */ +Status insertDatabaseEntryForBackwardCompatibility(OperationContext* opCtx, + const StringData& dbName) { + invariant(dbName == NamespaceString::kAdminDb || dbName == NamespaceString::kConfigDb); + + DBDirectClient client(opCtx); + auto commandResponse = client.runCommand([&] { + auto dbMetadata = DatabaseType(dbName.toString(), + ShardId::kConfigServerId, + dbName == NamespaceString::kConfigDb, + DatabaseVersion::makeFixed()); + + write_ops::InsertCommandRequest insertOp(NamespaceString::kShardConfigDatabasesNamespace); + insertOp.setDocuments({dbMetadata.toBSON()}); + return insertOp.serialize({}); + }()); + + auto commandStatus = getStatusFromWriteCommandReply(commandResponse->getCommandReply()); + return commandStatus.code() == ErrorCodes::DuplicateKey ? Status::OK() : commandStatus; +} + template <typename Derived> class FlushDatabaseCacheUpdatesCmdBase : public TypedCommand<Derived> { public: @@ -119,6 +144,26 @@ public: "Can't call _flushDatabaseCacheUpdates if in read-only mode", !storageGlobalParams.readOnly); + if (_dbName() == NamespaceString::kAdminDb || _dbName() == NamespaceString::kConfigDb) { + // The admin and config databases have fixed metadata that does not need to be + // refreshed. + + if (Base::request().getSyncFromConfig()) { + // To ensure compatibility with old secondaries that still call the + // _flushDatabaseCacheUpdates command to get updated database metadata from + // primary, an entry with fixed metadata is inserted in the + // config.cache.databases collection. + + LOGV2_DEBUG(6910800, + 1, + "Inserting a database collection entry with fixed metadata", + "db"_attr = _dbName()); + uassertStatusOK(insertDatabaseEntryForBackwardCompatibility(opCtx, _dbName())); + } + + return; + } + auto& oss = OperationShardingState::get(opCtx); { diff --git a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp index c00d00ff670..9d4936a9c82 100644 --- a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp +++ b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp @@ -67,6 +67,10 @@ void onDbVersionMismatch(OperationContext* opCtx, invariant(ShardingState::get(opCtx)->canAcceptShardedCommands()); + tassert(ErrorCodes::IllegalOperation, + "Can't check version of {} database"_format(dbName), + dbName != NamespaceString::kAdminDb && dbName != NamespaceString::kConfigDb); + if (serverDbVersion) { // Do not reorder these two statements! if the comparison is done through epochs, the // construction order matters: we are pessimistically assuming that the client version diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp index 2f7dc1e180b..b171b3689bf 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp @@ -498,6 +498,14 @@ SemiFuture<CollectionAndChangedChunks> ShardServerCatalogCacheLoader::getChunksS } SemiFuture<DatabaseType> ShardServerCatalogCacheLoader::getDatabase(StringData dbName) { + // The admin and config database have fixed metadata that does not need to be refreshed. + if (dbName == NamespaceString::kAdminDb || dbName == NamespaceString::kConfigDb) { + return DatabaseType(dbName.toString(), + ShardId::kConfigServerId, + dbName == NamespaceString::kConfigDb, + DatabaseVersion::makeFixed()); + } + const auto [isPrimary, term] = [&] { stdx::lock_guard<Latch> lock(_mutex); return std::make_tuple(_role == ReplicaSetRole::Primary, _term); |