diff options
author | Dianna Hohensee <dianna.hohensee@10gen.com> | 2018-01-10 17:37:50 -0500 |
---|---|---|
committer | Dianna Hohensee <dianna.hohensee@10gen.com> | 2018-01-12 08:58:34 -0500 |
commit | 6e57c0d022c15828ab8c16a1229b355e30e734b6 (patch) | |
tree | e4e6cd7ba83eaf272b77f4c867b7fda397bccb84 | |
parent | 11225541cbbaed58e27ff5254c145dd834a86190 (diff) | |
download | mongo-6e57c0d022c15828ab8c16a1229b355e30e734b6.tar.gz |
SERVER-32519 clean up WireVersion enum uses in the code to use LATEST_WIRE_VERSION
7 files changed, 177 insertions, 109 deletions
diff --git a/jstests/noPassthroughWithMongod/isMaster_feature_compatibility_version.js b/jstests/noPassthroughWithMongod/isMaster_feature_compatibility_version.js index 53ef53bff5b..726498f7891 100644 --- a/jstests/noPassthroughWithMongod/isMaster_feature_compatibility_version.js +++ b/jstests/noPassthroughWithMongod/isMaster_feature_compatibility_version.js @@ -1,6 +1,6 @@ // Tests that when the featureCompatibilityVersion is not equal to the downgrade version, running -// isMaster with internalClient returns a response with minWireVersion=maxWireVersion. This ensures -// that an older version mongod/mongos will fail to connect to the node when it is upgraded, +// isMaster with internalClient returns a response with minWireVersion == maxWireVersion. This +// ensures that an older version mongod/mongos will fail to connect to the node when it is upgraded, // upgrading, or downgrading. (function() { "use strict"; @@ -14,14 +14,14 @@ const downgradeVersion = "3.4"; // When the featureCompatibilityVersion is equal to the upgrade version, running isMaster with - // internalClient returns minWireVersion=maxWireVersion. + // internalClient returns minWireVersion == maxWireVersion. assert.commandWorked(adminDB.runCommand({setFeatureCompatibilityVersion: upgradeVersion})); let res = adminDB.runCommand(isMasterCommand); assert.commandWorked(res); assert.eq(res.minWireVersion, res.maxWireVersion, tojson(res)); // When the featureCompatibilityVersion is upgrading, running isMaster with internalClient - // returns minWireVersion=maxWireVersion. + // returns minWireVersion == maxWireVersion. assert.writeOK(adminDB.system.version.update( {_id: "featureCompatibilityVersion"}, {$set: {version: downgradeVersion, targetVersion: upgradeVersion}})); @@ -30,7 +30,7 @@ assert.eq(res.minWireVersion, res.maxWireVersion, tojson(res)); // When the featureCompatibilityVersion is downgrading, running isMaster with internalClient - // returns minWireVersion=maxWireVersion. + // returns minWireVersion == maxWireVersion. assert.writeOK(adminDB.system.version.update( {_id: "featureCompatibilityVersion"}, {$set: {version: downgradeVersion, targetVersion: downgradeVersion}})); @@ -39,17 +39,18 @@ assert.eq(res.minWireVersion, res.maxWireVersion, tojson(res)); // When the featureCompatibilityVersion is equal to the downgrade version, running isMaster with - // internalClient returns minWireVersion<maxWireVersion. + // internalClient returns minWireVersion + 1 == maxWireVersion. assert.commandWorked(adminDB.runCommand({setFeatureCompatibilityVersion: downgradeVersion})); res = adminDB.runCommand(isMasterCommand); assert.commandWorked(res); - assert.lt(res.minWireVersion, res.maxWireVersion, tojson(res)); + assert.eq(res.minWireVersion + 1, res.maxWireVersion, tojson(res)); - // When the internalClient field is missing from the isMaster command, the response has - // minWireVersion<maxWireVersion, even if the featureCompatibilityVersion is equal to the - // upgrade version. + // When the internalClient field is missing from the isMaster command, the response returns the + // full wire version range from minWireVersion == 0 to maxWireVersion == latest version, even if + // the featureCompatibilityVersion is equal to the upgrade version. assert.commandWorked(adminDB.runCommand({setFeatureCompatibilityVersion: upgradeVersion})); res = adminDB.runCommand({isMaster: 1}); assert.commandWorked(res); + assert.eq(res.minWireVersion, 0, tojson(res)); assert.lt(res.minWireVersion, res.maxWireVersion, tojson(res)); })(); diff --git a/src/mongo/client/scoped_db_conn_test.cpp b/src/mongo/client/scoped_db_conn_test.cpp index c117b73a0c7..13a9bb0cf7f 100644 --- a/src/mongo/client/scoped_db_conn_test.cpp +++ b/src/mongo/client/scoped_db_conn_test.cpp @@ -132,7 +132,7 @@ private: // We need to handle the isMaster received during connection. if (request.getCommandName() == "isMaster") { - commandResponse.append("maxWireVersion", WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + commandResponse.append("maxWireVersion", WireVersion::LATEST_WIRE_VERSION); commandResponse.append("minWireVersion", WireVersion::RELEASE_2_4_AND_BEFORE); } diff --git a/src/mongo/db/commands/feature_compatibility_version.cpp b/src/mongo/db/commands/feature_compatibility_version.cpp index 4e4867ed49d..589620d1acb 100644 --- a/src/mongo/db/commands/feature_compatibility_version.cpp +++ b/src/mongo/db/commands/feature_compatibility_version.cpp @@ -409,13 +409,8 @@ void FeatureCompatibilityVersion::updateMinWireVersion() { spec.outgoing.minWireVersion = LATEST_WIRE_VERSION; return; case ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo34: - // It would be preferable to set 'incomingInternalClient.minWireVersion' and - // 'outgoing.minWireVersion' to LATEST_WIRE_VERSION - 1, but this is not possible due to - // a bug in 3.4, where if the receiving node says it supports wire version range - // [COMMANDS_ACCEPT_WRITE_CONCERN, SUPPORTS_OP_MSG], the initiating node will think it - // only supports OP_QUERY. - spec.incomingInternalClient.minWireVersion = RELEASE_2_4_AND_BEFORE; - spec.outgoing.minWireVersion = RELEASE_2_4_AND_BEFORE; + spec.incomingInternalClient.minWireVersion = LATEST_WIRE_VERSION - 1; + spec.outgoing.minWireVersion = LATEST_WIRE_VERSION - 1; return; case ServerGlobalParams::FeatureCompatibility::Version::kUnsetDefault34Behavior: // getVersion() does not return this value. diff --git a/src/mongo/rpc/protocol_test.cpp b/src/mongo/rpc/protocol_test.cpp index 2c760cdc8e8..f3f8ba51f97 100644 --- a/src/mongo/rpc/protocol_test.cpp +++ b/src/mongo/rpc/protocol_test.cpp @@ -127,56 +127,148 @@ TEST(Protocol, parseProtocolSetFromIsMasterReply) { } while (0); TEST(Protocol, validateWireVersion) { - // Base Test + /* + * Test communication with a MongoD latest binary server with downgraded FCV. + */ + + // MongoD 'latest' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_OK, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); + + // MongoD 'latest' client -> MongoD downgraded 'last-stable' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 2, + WireVersion::LATEST_WIRE_VERSION - 1); - // Allowed during upgrade - // MongoD 3.4 client -> MongoD 3.4 server + // MongoD 'latest' client -> MongoD upgraded 'last-stable' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1); - // MongoD 3.4 client -> MongoD 3.2 server + // MongoD downgraded 'last-stable' client -> MongoD 'latest' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::FIND_COMMAND); + WireVersion::LATEST_WIRE_VERSION - 2, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); - // MongoD 3.2 client -> MongoD 3.4 server + // MongoD upgraded 'last-stable' client -> MongoD 'latest' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); - // MongoS 3.4 client -> MongoD 3.4 server + // MongoS 'latest' client -> MongoD 'latest' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); - // MongoS 3.2 client -> MongoD 3.4 server + // MongoS 'last-stable' client -> MongoD 'latest' server VALIDATE_WIRE_VERSION(ASSERT_OK, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::FIND_COMMAND, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); + /* + * Test communication with a MongoD latest binary server with upgraded FCV. + */ + + // MongoD 'latest' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + // MongoD 'latest' client -> MongoD downgraded 'last-stable' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 2, + WireVersion::LATEST_WIRE_VERSION - 1); + + // MongoD 'latest' client -> MongoD upgraded 'last-stable' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1); + + // MongoD downgraded 'last-stable' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION - 2, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + // MongoD upgraded 'last-stable' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + // MongoS 'latest' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + // MongoS 'last-stable' client -> MongoD 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + /* + * Test communication between MongoD latest binary servers where one has upgraded FCV and the + * other downgraded FCV. + */ + + // MongoD upgraded 'latest' client -> MongoD downgraded 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION); + + // MongoD downgraded 'latest' client -> MongoD upgraded 'latest' server + VALIDATE_WIRE_VERSION(ASSERT_OK, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION); + + /* + * Test that it is disallowed for MongoS to communicate with a lower binary server, regardless + * of FCV. + */ + + // MongoS 'latest' -> MongoD downgraded 'last-stable' server + VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 2, + WireVersion::LATEST_WIRE_VERSION - 1); - // Disallowed - // MongoS 3.4 -> MongoDB 3.2 server + // MongoS 'latest' -> MongoD upgraded 'last-stable' server VALIDATE_WIRE_VERSION(ASSERT_NOT_OK, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN, - WireVersion::RELEASE_2_4_AND_BEFORE, - WireVersion::FIND_COMMAND); + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION, + WireVersion::LATEST_WIRE_VERSION - 1, + WireVersion::LATEST_WIRE_VERSION - 1); } } // namespace diff --git a/src/mongo/s/catalog/sharding_catalog_add_shard_test.cpp b/src/mongo/s/catalog/sharding_catalog_add_shard_test.cpp index 5ce39eba1bf..e3695912e20 100644 --- a/src/mongo/s/catalog/sharding_catalog_add_shard_test.cpp +++ b/src/mongo/s/catalog/sharding_catalog_add_shard_test.cpp @@ -140,7 +140,7 @@ protected: ASSERT_EQ(request.dbname, "admin"); ASSERT_BSONOBJ_EQ(request.cmdObj, BSON("setFeatureCompatibilityVersion" - << "3.4")); + << "3.6")); return response; }); @@ -401,7 +401,7 @@ TEST_F(AddShardTest, StandaloneBasicSuccess) { }); BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); // Get databases list from new shard @@ -486,7 +486,7 @@ TEST_F(AddShardTest, StandaloneGenerateName) { }); BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); // Get databases list from new shard @@ -610,34 +610,6 @@ TEST_F(AddShardTest, AddMongosAsShard) { future.timed_get(kLongFutureTimeout); } -// Attempt to add a pre-v3.4 mongod. -TEST_F(AddShardTest, AddVersion32Shard) { - std::unique_ptr<RemoteCommandTargeterMock> targeter( - stdx::make_unique<RemoteCommandTargeterMock>()); - HostAndPort shardTarget("StandaloneHost:12345"); - targeter->setConnectionStringReturnValue(ConnectionString(shardTarget)); - targeter->setFindHostReturnValue(shardTarget); - - targeterFactory()->addTargeterToReturn(ConnectionString(shardTarget), std::move(targeter)); - std::string expectedShardName = "StandaloneShard"; - - auto future = launchAsync([this, &expectedShardName, &shardTarget] { - Client::initThreadIfNotAlready(); - auto status = - ShardingCatalogManager::get(operationContext()) - ->addShard( - operationContext(), &expectedShardName, ConnectionString(shardTarget), 100); - ASSERT_EQUALS(ErrorCodes::IncompatibleServerVersion, status); - }); - - // The maxWireVersion indicates that this is a v3.2 shard. - BSONObj commandResponse = - BSON("ok" << 1 << "ismaster" << true << "maxWireVersion" << WireVersion::FIND_COMMAND); - expectIsMaster(shardTarget, commandResponse); - - future.timed_get(kLongFutureTimeout); -} - // A replica set name was found for the host but no name was provided with the host. TEST_F(AddShardTest, AddReplicaSetShardAsStandalone) { std::unique_ptr<RemoteCommandTargeterMock> targeter( @@ -662,7 +634,7 @@ TEST_F(AddShardTest, AddReplicaSetShardAsStandalone) { BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "setName" << "myOtherSet" << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -690,7 +662,7 @@ TEST_F(AddShardTest, AddStandaloneHostShardAsReplicaSet) { }); BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -720,7 +692,7 @@ TEST_F(AddShardTest, ReplicaSetMistmatchedReplicaSetName) { BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "setName" << "myOtherSet" << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -753,7 +725,7 @@ TEST_F(AddShardTest, ShardIsCSRSConfigServer) { << "configsvr" << true << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -788,7 +760,7 @@ TEST_F(AddShardTest, ReplicaSetMissingHostsProvidedInSeedList) { << "hosts" << hosts.arr() << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -824,7 +796,7 @@ TEST_F(AddShardTest, AddShardWithNameConfigFails) { << "hosts" << hosts.arr() << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); future.timed_get(kLongFutureTimeout); @@ -873,7 +845,7 @@ TEST_F(AddShardTest, ShardContainsExistingDatabase) { << "hosts" << hosts.arr() << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); expectListDatabases(shardTarget, {BSON("name" << existingDB.getName())}); @@ -920,7 +892,7 @@ TEST_F(AddShardTest, SuccessfullyAddReplicaSet) { << "hosts" << hosts.arr() << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); // Get databases list from new shard @@ -987,7 +959,7 @@ TEST_F(AddShardTest, ReplicaSetExtraHostsDiscovered) { << "hosts" << hosts.arr() << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); // Get databases list from new shard @@ -1063,7 +1035,7 @@ TEST_F(AddShardTest, AddShardSucceedsEvenIfAddingDBsFromNewShardFails) { }); BSONObj commandResponse = BSON("ok" << 1 << "ismaster" << true << "maxWireVersion" - << WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + << WireVersion::LATEST_WIRE_VERSION); expectIsMaster(shardTarget, commandResponse); // Get databases list from new shard diff --git a/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp b/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp index bb208c19063..ac28fb3b82c 100644 --- a/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp +++ b/src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp @@ -306,7 +306,12 @@ StatusWith<ShardType> ShardingCatalogManager::_validateHostAsShard( const ConnectionString& connectionString) { auto swCommandResponse = _runCommandForAddShard(opCtx, targeter.get(), "admin", BSON("isMaster" << 1)); - if (!swCommandResponse.isOK()) { + if (swCommandResponse.getStatus() == ErrorCodes::IncompatibleServerVersion) { + return {swCommandResponse.getStatus().code(), + str::stream() << "Cannot add " << connectionString.toString() + << " as a shard because its binary version is not compatible with " + "the cluster's featureCompatibilityVersion."}; + } else if (!swCommandResponse.isOK()) { return swCommandResponse.getStatus(); } @@ -328,8 +333,11 @@ StatusWith<ShardType> ShardingCatalogManager::_validateHostAsShard( return {ErrorCodes::IllegalOperation, "cannot add a mongos as a shard"}; } - // Fail if the node being added's binary version is lower than the cluster's - // featureCompatibilityVersion. + // Extract the maxWireVersion so we can verify that the node being added has a binary version + // greater than or equal to the cluster's featureCompatibilityVersion. We expect an incompatible + // binary node to be unable to communicate, returning an IncompatibleServerVersion error, + // because of our internal wire version protocol. So we can safely invariant here that the node + // is compatible. long long maxWireVersion; Status status = bsonExtractIntegerField(resIsMaster, "maxWireVersion", &maxWireVersion); if (!status.isOK()) { @@ -340,16 +348,11 @@ StatusWith<ShardType> ShardingCatalogManager::_validateHostAsShard( << " as a shard: " << status.reason()); } - if (((serverGlobalParams.featureCompatibility.getVersion() == - ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo36) && - maxWireVersion < WireVersion::LATEST_WIRE_VERSION) || - ((serverGlobalParams.featureCompatibility.getVersion() != - ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo36) && - maxWireVersion < WireVersion::LATEST_WIRE_VERSION - 1)) { - return {ErrorCodes::IncompatibleServerVersion, - str::stream() << "Cannot add " << connectionString.toString() - << " as a shard because its binary version is not compatible with " - "the cluster's featureCompatibilityVersion."}; + if (serverGlobalParams.featureCompatibility.getVersion() == + ServerGlobalParams::FeatureCompatibility::Version::kFullyDowngradedTo34) { + invariant(maxWireVersion >= WireVersion::LATEST_WIRE_VERSION - 1); + } else { + invariant(maxWireVersion >= WireVersion::LATEST_WIRE_VERSION); } // Check whether there is a master. If there isn't, the replica set may not have been diff --git a/src/mongo/s/sharding_mongod_test_fixture.cpp b/src/mongo/s/sharding_mongod_test_fixture.cpp index a211fa3e4f9..df8dcd88f48 100644 --- a/src/mongo/s/sharding_mongod_test_fixture.cpp +++ b/src/mongo/s/sharding_mongod_test_fixture.cpp @@ -145,6 +145,11 @@ void ShardingMongodTestFixture::setUp() { service->setOpObserver(stdx::make_unique<OpObserverImpl>()); repl::setOplogCollectionName(); repl::createOplog(_opCtx.get()); + + // Set the highest FCV because otherwise it defaults to the lower FCV. This way we default to + // testing this release's code, not backwards compatibility code. + serverGlobalParams.featureCompatibility.setVersion( + ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo36); } std::unique_ptr<ReplicationCoordinatorMock> ShardingMongodTestFixture::makeReplicationCoordinator( |