From 393c9d79b9f8e0cd39c652ab7784f2c4977d5ecd Mon Sep 17 00:00:00 2001 From: Jack Mulrow Date: Tue, 24 Sep 2019 18:59:52 +0000 Subject: [PATCH] SERVER-42367 Disallow refineCollectionShardKey in FCV < 4.4 --- .../refine_collection_shard_key_fcv.js | 36 +++++++++++++++++++ ...vr_refine_collection_shard_key_command.cpp | 7 ++++ 2 files changed, 43 insertions(+) create mode 100644 jstests/multiVersion/refine_collection_shard_key_fcv.js diff --git a/jstests/multiVersion/refine_collection_shard_key_fcv.js b/jstests/multiVersion/refine_collection_shard_key_fcv.js new file mode 100644 index 0000000000000..1bdf5ca6461de --- /dev/null +++ b/jstests/multiVersion/refine_collection_shard_key_fcv.js @@ -0,0 +1,36 @@ +// Verifies refineCollectionShardKey can only be run when a cluster's FCV is 4.4. + +(function() { +"use strict"; + +const dbName = "test"; +const collName = "foo"; +const ns = dbName + '.' + collName; + +const st = new ShardingTest({shards: 1}); +const configAdminDB = st.configRS.getPrimary().getDB("admin"); + +assert.commandWorked(st.s.adminCommand({enableSharding: dbName})); +assert.commandWorked(st.s.adminCommand({shardCollection: ns, key: {_id: 1}})); + +// Create an index that can be used for the following shard key refines. +assert.commandWorked(st.s.getCollection(ns).createIndex({_id: 1, x: 1, y: 1})); + +// Refining a shard key succeeds in FCV 4.4. +checkFCV(configAdminDB, latestFCV); +assert.commandWorked(st.s.adminCommand({refineCollectionShardKey: ns, key: {_id: 1, x: 1}})); + +// Refining a shard key fails in FCV 4.2. +assert.commandWorked(st.s.adminCommand({setFeatureCompatibilityVersion: lastStableFCV})); +checkFCV(configAdminDB, lastStableFCV); +assert.commandFailedWithCode( + st.s.adminCommand({refineCollectionShardKey: ns, key: {_id: 1, x: 1, y: 1}}), + ErrorCodes.CommandNotSupported); + +// Refining a shard key succeeds after upgrading back to FCV 4.4. +assert.commandWorked(st.s.adminCommand({setFeatureCompatibilityVersion: latestFCV})); +checkFCV(configAdminDB, latestFCV); +assert.commandWorked(st.s.adminCommand({refineCollectionShardKey: ns, key: {_id: 1, x: 1, y: 1}})); + +st.stop(); +}()); diff --git a/src/mongo/db/s/config/configsvr_refine_collection_shard_key_command.cpp b/src/mongo/db/s/config/configsvr_refine_collection_shard_key_command.cpp index 0020ae529b418..3b6a93370148d 100644 --- a/src/mongo/db/s/config/configsvr_refine_collection_shard_key_command.cpp +++ b/src/mongo/db/s/config/configsvr_refine_collection_shard_key_command.cpp @@ -37,6 +37,7 @@ #include "mongo/db/repl/repl_client_info.h" #include "mongo/db/s/config/sharding_catalog_manager.h" #include "mongo/db/s/shard_key_util.h" +#include "mongo/db/server_options.h" #include "mongo/s/catalog/dist_lock_manager.h" #include "mongo/s/grid.h" #include "mongo/s/request_types/refine_collection_shard_key_gen.h" @@ -64,6 +65,12 @@ class ConfigsvrRefineCollectionShardKeyCommand final "refineCollectionShardKey must be called with majority writeConcern", opCtx->getWriteConcern().wMode == WriteConcernOptions::kMajority); + uassert(ErrorCodes::CommandNotSupported, + "'refineCollectionShardKey' is only supported in feature compatibility version " + "4.4", + serverGlobalParams.featureCompatibility.getVersion() == + ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo44); + // Set the operation context read concern level to local for reads into the config // database. repl::ReadConcernArgs::get(opCtx) =