diff options
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 // |