summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Fuschetto <antonio.fuschetto@mongodb.com>2022-09-14 15:59:22 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-15 07:42:06 +0000
commitaa8a3126a2857f235a14aca96cdcd897e42990cf (patch)
treea0514d8f4ffb62f6a41db4fa43dcbd500eb994e6
parent2eebadf82faa58ac5aebc9e8238c7b299e316a7d (diff)
downloadmongo-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.cpp45
-rw-r--r--src/mongo/db/s/shard_filtering_metadata_refresh.cpp4
-rw-r--r--src/mongo/db/s/shard_server_catalog_cache_loader.cpp8
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);