summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordi Serra Torrens <jordi.serra-torrens@mongodb.com>2020-11-09 18:12:49 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-11-11 15:56:13 +0000
commit2ba5a7aee01d0b482f7f63d1fcabb90cb2a6897c (patch)
tree7194c8ccd4763fd9f8e2ea8d82e2728e94eb3ea2
parentf5ad04df2255518e16048e09dcf2baeff64bd7a8 (diff)
downloadmongo-2ba5a7aee01d0b482f7f63d1fcabb90cb2a6897c.tar.gz
SERVER-51880: Remove all {dropped:true} entries from config.collection on FCV upgrade
-rw-r--r--jstests/multiVersion/upgrade_downgrade_sharded_cluster.js75
-rw-r--r--src/mongo/db/commands/set_feature_compatibility_version_command.cpp14
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager.cpp9
-rw-r--r--src/mongo/db/s/config/sharding_catalog_manager.h11
4 files changed, 108 insertions, 1 deletions
diff --git a/jstests/multiVersion/upgrade_downgrade_sharded_cluster.js b/jstests/multiVersion/upgrade_downgrade_sharded_cluster.js
new file mode 100644
index 00000000000..77a7c19e014
--- /dev/null
+++ b/jstests/multiVersion/upgrade_downgrade_sharded_cluster.js
@@ -0,0 +1,75 @@
+/**
+ * This test checks several upgrade/downgrade routines related to sharding, namely:
+ * - The entries in the config server's config.collections that were marked as 'dropped: true' are
+ * deleted. (SERVER-52630: Remove once 5.0 becomes the LastLTS)
+ */
+(function() {
+"use strict";
+
+load('./jstests/multiVersion/libs/multi_cluster.js'); // for upgradeCluster()
+
+function setupInitialStateOnOldVersion() {
+ let csrs_config_db = st.configRS.getPrimary().getDB('config');
+
+ // Setup sharded collections
+ assert.commandWorked(st.s.adminCommand({enableSharding: 'sharded'}));
+ assert.commandWorked(st.s.adminCommand({shardCollection: 'sharded.foo', key: {x: 1}}));
+ assert.commandWorked(st.s.adminCommand({shardCollection: 'sharded.bar', key: {x: 1}}));
+
+ assert.neq(null, csrs_config_db.collections.findOne({_id: 'sharded.foo'}));
+ assert.neq(null, csrs_config_db.collections.findOne({_id: 'sharded.bar'}));
+
+ // Drop a collection so that it's metadata is left over on the config server's
+ // config.collections as 'dropped: true'
+ st.s.getDB('sharded').foo.drop();
+ assert.eq(true, csrs_config_db.collections.findOne({_id: 'sharded.foo'}).dropped);
+ assert.neq(null, csrs_config_db.collections.findOne({_id: 'sharded.bar'}));
+}
+
+function runChecksAfterUpgrade() {
+ let csrs_config_db = st.configRS.getPrimary().getDB('config');
+ // Check that the left over metadata at csrs config.collections has been cleaned up.
+ assert.eq(null, csrs_config_db.collections.findOne({_id: 'sharded.foo'}));
+ assert.neq(null, csrs_config_db.collections.findOne({_id: 'sharded.bar'}));
+}
+
+function runChecksAfterDowngrade() {
+}
+
+// Start a sharded cluster on version 4.4
+let old_version = '4.4';
+var st = new ShardingTest({
+ shards: 2,
+ mongos: 1,
+ other: {
+ mongosOptions: {binVersion: old_version},
+ configOptions: {binVersion: old_version},
+ shardOptions: {binVersion: old_version},
+
+ rsOptions: {binVersion: old_version},
+ rs: true,
+ }
+});
+st.configRS.awaitReplication();
+
+// Setup initial conditions on 4.4
+setupInitialStateOnOldVersion();
+
+// Upgrade the entire cluster to the latest version.
+jsTest.log('upgrading cluster');
+st.upgradeCluster('latest');
+assert.commandWorked(st.s.adminCommand({setFeatureCompatibilityVersion: latestFCV}));
+
+// Tests after upgrade
+runChecksAfterUpgrade();
+
+// Downgrade back to 4.4
+jsTest.log('downgrading cluster');
+assert.commandWorked(st.s.adminCommand({setFeatureCompatibilityVersion: old_version}));
+st.upgradeCluster(old_version);
+
+// Tests after downgrade to 4.4
+runChecksAfterDowngrade();
+
+st.stop();
+})();
diff --git a/src/mongo/db/commands/set_feature_compatibility_version_command.cpp b/src/mongo/db/commands/set_feature_compatibility_version_command.cpp
index c2e9cfe5cec..3a69b2340f3 100644
--- a/src/mongo/db/commands/set_feature_compatibility_version_command.cpp
+++ b/src/mongo/db/commands/set_feature_compatibility_version_command.cpp
@@ -243,8 +243,20 @@ public:
_deleteHaystackIndexesOnUpgrade(opCtx);
}
- // Upgrade shards before config finishes its upgrade.
if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) {
+ if (actualVersion ==
+ ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo44 ||
+ actualVersion ==
+ ServerGlobalParams::FeatureCompatibility::Version::kUpgradingFrom44To47 ||
+ actualVersion ==
+ ServerGlobalParams::FeatureCompatibility::Version::kUpgradingFrom44To48 ||
+ actualVersion ==
+ ServerGlobalParams::FeatureCompatibility::Version::kUpgradingFrom44To49) {
+ // SERVER-52630: Remove once 5.0 becomes the LastLTS
+ ShardingCatalogManager::get(opCtx)->removeDroppedCollectionsMetadata(opCtx);
+ }
+
+ // Upgrade shards before config finishes its upgrade.
uassertStatusOK(
ShardingCatalogManager::get(opCtx)->setFeatureCompatibilityVersionOnShards(
opCtx, CommandHelpers::appendMajorityWriteConcern(request.toBSON({}))));
diff --git a/src/mongo/db/s/config/sharding_catalog_manager.cpp b/src/mongo/db/s/config/sharding_catalog_manager.cpp
index ff8e7c04f8d..bb1c707407c 100644
--- a/src/mongo/db/s/config/sharding_catalog_manager.cpp
+++ b/src/mongo/db/s/config/sharding_catalog_manager.cpp
@@ -436,6 +436,15 @@ Status ShardingCatalogManager::setFeatureCompatibilityVersionOnShards(OperationC
return Status::OK();
}
+void ShardingCatalogManager::removeDroppedCollectionsMetadata(OperationContext* opCtx) {
+ const auto catalogClient = Grid::get(opCtx)->catalogClient();
+ uassertStatusOK(
+ catalogClient->removeConfigDocuments(opCtx,
+ CollectionType::ConfigNS,
+ BSON("dropped" << true),
+ ShardingCatalogClient::kMajorityWriteConcern));
+}
+
Lock::ExclusiveLock ShardingCatalogManager::lockZoneMutex(OperationContext* opCtx) {
Lock::ExclusiveLock lk(opCtx->lockState(), _kZoneOpLock);
return lk;
diff --git a/src/mongo/db/s/config/sharding_catalog_manager.h b/src/mongo/db/s/config/sharding_catalog_manager.h
index 5ae612814fd..06022f7b242 100644
--- a/src/mongo/db/s/config/sharding_catalog_manager.h
+++ b/src/mongo/db/s/config/sharding_catalog_manager.h
@@ -444,6 +444,17 @@ public:
*/
Status setFeatureCompatibilityVersionOnShards(OperationContext* opCtx, const BSONObj& cmdObj);
+ /**
+ * Removes all entries from the config server's config.collections where 'dropped' is true.
+ *
+ * Before v5.0, when a collection was dropped, its entry in config.collections remained, tagged
+ * as 'dropped: true'. As those are no longer needed, this method cleans up the leftover
+ * metadata.
+ *
+ * It shall be called on FCV 4.4 to 5.0 upgrade.
+ */
+ void removeDroppedCollectionsMetadata(OperationContext* opCtx);
+
//
// For Diagnostics
//