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 /src | |
parent | 11225541cbbaed58e27ff5254c145dd834a86190 (diff) | |
download | mongo-6e57c0d022c15828ab8c16a1229b355e30e734b6.tar.gz |
SERVER-32519 clean up WireVersion enum uses in the code to use LATEST_WIRE_VERSION
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/client/scoped_db_conn_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/feature_compatibility_version.cpp | 9 | ||||
-rw-r--r-- | src/mongo/rpc/protocol_test.cpp | 166 | ||||
-rw-r--r-- | src/mongo/s/catalog/sharding_catalog_add_shard_test.cpp | 54 | ||||
-rw-r--r-- | src/mongo/s/catalog/sharding_catalog_manager_shard_operations.cpp | 29 | ||||
-rw-r--r-- | src/mongo/s/sharding_mongod_test_fixture.cpp | 5 |
6 files changed, 166 insertions, 99 deletions
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( |