diff options
author | Shin Yee Tan <shinyee.tan@mongodb.com> | 2023-05-04 05:28:08 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-05-04 06:03:32 +0000 |
commit | b18b2baa50186e3031d7c6dbd4dbc232125f543c (patch) | |
tree | 1a2417effbaffe9047946b36ab6f5d224bffcb35 | |
parent | d631952fa7ea7e889e2060eb137b483461c8c053 (diff) | |
download | mongo-b18b2baa50186e3031d7c6dbd4dbc232125f543c.tar.gz |
SERVER-68633 Add a check to ensure that new config server collections are added to the _configsvrRunRestore command
-rw-r--r-- | jstests/sharding/run_restore.js | 18 | ||||
-rw-r--r-- | src/mongo/db/s/config/configsvr_run_restore_command.cpp | 22 | ||||
-rw-r--r-- | src/mongo/db/s/config/known_collections.h | 94 |
3 files changed, 133 insertions, 1 deletions
diff --git a/jstests/sharding/run_restore.js b/jstests/sharding/run_restore.js index d16560f8725..19e7dc99ebe 100644 --- a/jstests/sharding/run_restore.js +++ b/jstests/sharding/run_restore.js @@ -166,4 +166,22 @@ assert.eq(1, conn.getDB("config").getCollection("databases").find({_id: "test"}) assert.eq(0, conn.getDB("config").getCollection("databases").find({_id: "unusedDB"}).count()); MongoRunner.stopMongod(conn); + +// Start the config server in standalone restore mode. +conn = MongoRunner.runMongod({noCleanData: true, dbpath: configDbPath, restore: ""}); +assert(conn); + +// '_configsvrRunRestore' command ignores cache collections. +assert.commandWorked(conn.getDB("config").createCollection("cache.test")); +assert.commandWorked(conn.getDB("admin").runCommand({_configsvrRunRestore: 1})); + +// Can't run during testing if the config server has unrecognized collections. +assert.commandWorked(conn.getDB("config").createCollection("unknown")); +let error = assert.throws(function() { + conn.getDB("admin").runCommand({_configsvrRunRestore: 1}); +}); +assert(isNetworkError(error)); + +// The server should have crashed from fatally asserting on unknown config collection. +MongoRunner.stopMongod(conn, null, {allowedExitCode: MongoRunner.EXIT_ABORT}); }()); diff --git a/src/mongo/db/s/config/configsvr_run_restore_command.cpp b/src/mongo/db/s/config/configsvr_run_restore_command.cpp index 605354e492e..01ab8475389 100644 --- a/src/mongo/db/s/config/configsvr_run_restore_command.cpp +++ b/src/mongo/db/s/config/configsvr_run_restore_command.cpp @@ -35,9 +35,11 @@ #include "mongo/db/dbdirectclient.h" #include "mongo/db/repl/replication_coordinator.h" #include "mongo/db/repl/storage_interface_impl.h" +#include "mongo/db/s/config/known_collections.h" #include "mongo/logv2/log.h" #include "mongo/stdx/unordered_map.h" #include "mongo/util/assert_util.h" +#include "mongo/util/testing_proctor.h" #include "mongo/util/uuid.h" #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding @@ -189,6 +191,25 @@ public: restoreColl); } + DBDirectClient client(opCtx); + + if (TestingProctor::instance().isEnabled()) { + // All collections in the config server must be defined in kConfigCollections. + // Collections to restore should be defined in kCollectionEntries. + auto collInfos = + client.getCollectionInfos(DatabaseNameUtil::deserialize(boost::none, "config")); + for (auto&& info : collInfos) { + StringData collName = info.getStringField("name"); + // Ignore cache collections as they will be dropped later in the restore procedure. + if (kConfigCollections.find(collName) == kConfigCollections.end() && + !collName.startsWith("cache")) { + LOGV2_FATAL(6863300, + "Identified unknown collection in config server.", + "collName"_attr = collName); + } + } + } + for (const auto& collectionEntry : kCollectionEntries) { const NamespaceString& nss = collectionEntry.first; boost::optional<std::string> nssFieldName = collectionEntry.second.first; @@ -203,7 +224,6 @@ public: continue; } - DBDirectClient client(opCtx); auto findRequest = FindCommandRequest(nss); auto cursor = client.find(findRequest); diff --git a/src/mongo/db/s/config/known_collections.h b/src/mongo/db/s/config/known_collections.h new file mode 100644 index 00000000000..731b58fb779 --- /dev/null +++ b/src/mongo/db/s/config/known_collections.h @@ -0,0 +1,94 @@ +/** + * Copyright (C) 2023-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ +#include "mongo/db/namespace_string.h" +#include "mongo/util/string_map.h" + +namespace mongo { +// Check for necessary restore procedures before adding collection to this set. If restore procedure +// is necessary, additions to this set should also be added to kCollectionEntries in +// 'configsvr_run_restore_command.cpp'. +const StringDataSet kConfigCollections{ + "actionlog", + "changelog", + "chunks", + "migrations", + "mongos", + "movePrimaryRecipients", + "system.preimages", + "tags", + "version", + NamespaceString::kClusterParametersNamespace.coll(), + NamespaceString::kCollectionCriticalSectionsNamespace.coll(), + NamespaceString::kCompactStructuredEncryptionCoordinatorNamespace.coll(), + NamespaceString::kConfigAnalyzeShardKeySplitPointsNamespace.coll(), + NamespaceString::kConfigDatabasesNamespace.coll(), + NamespaceString::kConfigImagesNamespace.coll(), + NamespaceString::kConfigQueryAnalyzersNamespace.coll(), + NamespaceString::kConfigReshardingOperationsNamespace.coll(), + NamespaceString::kConfigSampledQueriesDiffNamespace.coll(), + NamespaceString::kConfigSampledQueriesNamespace.coll(), + NamespaceString::kConfigSettingsNamespace.coll(), + NamespaceString::kConfigsvrCollectionsNamespace.coll(), + NamespaceString::kConfigsvrCoordinatorsNamespace.coll(), + NamespaceString::kConfigsvrIndexCatalogNamespace.coll(), + NamespaceString::kConfigsvrPlacementHistoryNamespace.coll(), + NamespaceString::kConfigsvrShardsNamespace.coll(), + NamespaceString::kDistLocksNamepsace.coll(), + NamespaceString::kDonorReshardingOperationsNamespace.coll(), + NamespaceString::kExternalKeysCollectionNamespace.coll(), + NamespaceString::kForceOplogBatchBoundaryNamespace.coll(), + NamespaceString::kGlobalIndexClonerNamespace.coll(), + NamespaceString::kIndexBuildEntryNamespace.coll(), + NamespaceString::kLockpingsNamespace.coll(), + NamespaceString::kLogicalSessionsNamespace.coll(), + NamespaceString::kMigrationCoordinatorsNamespace.coll(), + NamespaceString::kMigrationRecipientsNamespace.coll(), + NamespaceString::kRangeDeletionForRenameNamespace.coll(), + NamespaceString::kRangeDeletionNamespace.coll(), + NamespaceString::kRecipientReshardingOperationsNamespace.coll(), + NamespaceString::kReshardingApplierProgressNamespace.coll(), + NamespaceString::kReshardingApplierProgressNamespace.coll(), + NamespaceString::kReshardingTxnClonerProgressNamespace.coll(), + NamespaceString::kSessionTransactionsTableNamespace.coll(), + NamespaceString::kSessionTransactionsTableNamespace.coll(), + NamespaceString::kSetChangeStreamStateCoordinatorNamespace.coll(), + NamespaceString::kShardCollectionCatalogNamespace.coll(), + NamespaceString::kShardConfigCollectionsNamespace.coll(), + NamespaceString::kShardConfigDatabasesNamespace.coll(), + NamespaceString::kShardIndexCatalogNamespace.coll(), + NamespaceString::kShardingDDLCoordinatorsNamespace.coll(), + NamespaceString::kShardingRenameParticipantsNamespace.coll(), + NamespaceString::kShardSplitDonorsNamespace.coll(), + NamespaceString::kTenantMigrationDonorsNamespace.coll(), + NamespaceString::kTenantMigrationRecipientsNamespace.coll(), + NamespaceString::kTransactionCoordinatorsNamespace.coll(), + NamespaceString::kUserWritesCriticalSectionsNamespace.coll(), + NamespaceString::kVectorClockNamespace.coll(), +}; +} // namespace mongo |