summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShin Yee Tan <shinyee.tan@mongodb.com>2023-05-04 05:28:08 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-05-04 06:03:32 +0000
commitb18b2baa50186e3031d7c6dbd4dbc232125f543c (patch)
tree1a2417effbaffe9047946b36ab6f5d224bffcb35
parentd631952fa7ea7e889e2060eb137b483461c8c053 (diff)
downloadmongo-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.js18
-rw-r--r--src/mongo/db/s/config/configsvr_run_restore_command.cpp22
-rw-r--r--src/mongo/db/s/config/known_collections.h94
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