From e114f74a9b3bf087f15dfbee5d7250b2839308e7 Mon Sep 17 00:00:00 2001 From: David Storch Date: Wed, 21 Sep 2016 18:44:56 -0400 Subject: SERVER-25158 prevent 3.2 mongos from connecting to a featureCompatibilityVersion 3.4 config server --- buildscripts/resmokeconfig/suites/multiversion.yml | 3 +++ .../suites/sharding_last_stable_mongos_and_mixed_shards.yml | 5 +++++ jstests/sharding/server_status.js | 2 +- src/mongo/db/repl/replication_info.cpp | 9 ++++++++- src/mongo/s/client/sharding_connection_hook.cpp | 13 ++++++++++--- src/mongo/shell/shardingtest.js | 10 +++++----- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/buildscripts/resmokeconfig/suites/multiversion.yml b/buildscripts/resmokeconfig/suites/multiversion.yml index 95c81adcc12..c97b6fc8d98 100644 --- a/buildscripts/resmokeconfig/suites/multiversion.yml +++ b/buildscripts/resmokeconfig/suites/multiversion.yml @@ -8,6 +8,9 @@ selector: - jstests/multiVersion/transitioning_to_and_from_WT.js # TODO: SERVER-21578 - jstests/multiVersion/balancer_multiVersion_detect.js + # TODO: SERVER-26261 + - jstests/multiVersion/2_test_launching_cluster.js + - jstests/multiVersion/dumprestore_sharded.js # Multiversion tests start their own mongod's. executor: diff --git a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml index e7b5b9fbef7..97753edcf7b 100644 --- a/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml +++ b/buildscripts/resmokeconfig/suites/sharding_last_stable_mongos_and_mixed_shards.yml @@ -66,6 +66,11 @@ selector: # Testing features that do not exist on v3.2 shards. - jstests/sharding/migration_server_status.js - jstests/sharding/movechunk_parallel.js + # These tests do not use ShardingTest which handles setting the featureCompatibilityVersion to + # 3.2 when in a mixed configuration. Enable when 3.4 becomes last-stable. + - jstests/sharding/autodiscover_config_rs_from_secondary.js + - jstests/sharding/config_rs_change.js + - jstests/sharding/mongos_wait_csrs_initiate.js executor: js_test: diff --git a/jstests/sharding/server_status.js b/jstests/sharding/server_status.js index b8e59b22275..892e1748ed9 100644 --- a/jstests/sharding/server_status.js +++ b/jstests/sharding/server_status.js @@ -27,7 +27,7 @@ if (isCSRS) { assert.gt(configConnStr.indexOf('/'), 0); - assert.eq(1, configIsMaster.configsvr); // If it's a shard, this field won't exist. + assert.gte(configIsMaster.configsvr, 1); // If it's a shard, this field won't exist. assert.neq(null, configOpTimeObj); assert.neq(null, configOpTimeObj.ts); assert.neq(null, configOpTimeObj.t); diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp index d27257a8eb0..d655ccfa73b 100644 --- a/src/mongo/db/repl/replication_info.cpp +++ b/src/mongo/db/repl/replication_info.cpp @@ -279,7 +279,14 @@ public: appendReplicationInfo(txn, result, 0); if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) { - result.append("configsvr", 1); + // If we have feature compatibility version 3.4, use a config server mode that 3.2 + // mongos won't understand. This should prevent a 3.2 mongos from joining the cluster or + // making a connection to the config servers. + int configServerModeNumber = (serverGlobalParams.featureCompatibility.version.load() == + ServerGlobalParams::FeatureCompatibility::Version::k34) + ? 2 + : 1; + result.append("configsvr", configServerModeNumber); } result.appendNumber("maxBsonObjectSize", BSONObjMaxUserSize); diff --git a/src/mongo/s/client/sharding_connection_hook.cpp b/src/mongo/s/client/sharding_connection_hook.cpp index b24bccd3381..7085a290a0c 100644 --- a/src/mongo/s/client/sharding_connection_hook.cpp +++ b/src/mongo/s/client/sharding_connection_hook.cpp @@ -99,10 +99,17 @@ void ShardingConnectionHook::onCreate(DBClientBase* conn) { return; } + const long long minKnownConfigServerMode = 1; + const long long maxKnownConfigServerMode = 2; uassert(28785, - str::stream() << "Unrecognized configsvr version number: " << configServerModeNumber - << ". Expected either 0 or 1", - configServerModeNumber == 0 || configServerModeNumber == 1); + str::stream() << "Unrecognized configsvr mode number: " << configServerModeNumber + << ". Range of known configsvr mode numbers is: [" + << minKnownConfigServerMode + << ", " + << maxKnownConfigServerMode + << "]", + configServerModeNumber >= minKnownConfigServerMode && + configServerModeNumber <= maxKnownConfigServerMode); uassertStatusOK(status); } diff --git a/src/mongo/shell/shardingtest.js b/src/mongo/shell/shardingtest.js index 0eb553ecfca..fe042cbcafa 100644 --- a/src/mongo/shell/shardingtest.js +++ b/src/mongo/shell/shardingtest.js @@ -1226,29 +1226,29 @@ var ShardingTest = function(params) { */ function shouldSetFeatureCompatibilityVersion32() { if (otherParams.configOptions && otherParams.configOptions.binVersion && - otherParams.configOptions.binVersion === '3.2') { + MongoRunner.getBinVersionFor(otherParams.configOptions.binVersion) === '3.2') { return false; } if (jsTestOptions().shardMixedBinVersions) { return true; } if (otherParams.shardOptions && otherParams.shardOptions.binVersion && - otherParams.shardOptions.binVersion === '3.2') { + MongoRunner.getBinVersionFor(otherParams.shardOptions.binVersion) === '3.2') { return true; } for (var i = 0; i < numShards; i++) { if (otherParams['d' + i] && otherParams['d' + i].binVersion && - otherParams['d' + i].binVersion === '3.2') { + MongoRunner.getBinVersionFor(otherParams['d' + i].binVersion) === '3.2') { return true; } } if (otherParams.mongosOptions && otherParams.mongosOptions.binVersion && - otherParams.mongosOptions.binVersion === '3.2') { + MongoRunner.getBinVersionFor(otherParams.mongosOptions.binVersion) === '3.2') { return true; } for (var i = 0; i < numMongos; i++) { if (otherParams['s' + i] && otherParams['s' + i].binVersion && - otherParams['s' + i].binVersion === '3.2') { + MongoRunner.getBinVersionFor(otherParams['s' + i].binVersion) === '3.2') { return true; } } -- cgit v1.2.1