diff options
-rw-r--r-- | src/mongo/client/sdam/server_selection_json_test_runner.cpp | 25 | ||||
-rw-r--r-- | src/mongo/client/sdam/server_selector.cpp | 3 | ||||
-rw-r--r-- | src/mongo/client/sdam/server_selector_test.cpp | 30 |
3 files changed, 45 insertions, 13 deletions
diff --git a/src/mongo/client/sdam/server_selection_json_test_runner.cpp b/src/mongo/client/sdam/server_selection_json_test_runner.cpp index cc1e50d28b1..72379e27165 100644 --- a/src/mongo/client/sdam/server_selection_json_test_runner.cpp +++ b/src/mongo/client/sdam/server_selection_json_test_runner.cpp @@ -387,18 +387,19 @@ private: setName); _topologyDescription = std::make_shared<TopologyDescription>(config); - if (_jsonTest.hasField("in_latency_window")) { - const std::vector<BSONElement>& bsonLatencyWindow = - _jsonTest["in_latency_window"].Array(); - for (const auto& serverDescription : serverDescriptions) { - _topologyDescription->installServerDescription(serverDescription); - - for (auto bsonServer : bsonLatencyWindow) { - auto server = bsonServer.Obj(); - if (serverDescription->getAddress() == - HostAndPort(server.getStringField("address"))) { - _inLatencyWindow.push_back(serverDescription); - } + std::vector<BSONElement> bsonLatencyWindow; + if (auto inLatencyWindowElem = _jsonTest["in_latency_window"]) { + bsonLatencyWindow = inLatencyWindowElem.Array(); + } + + for (const auto& serverDescription : serverDescriptions) { + _topologyDescription->installServerDescription(serverDescription); + + for (auto bsonServer : bsonLatencyWindow) { + auto server = bsonServer.Obj(); + if (serverDescription->getAddress() == + HostAndPort(server.getStringField("address"))) { + _inLatencyWindow.push_back(serverDescription); } } } diff --git a/src/mongo/client/sdam/server_selector.cpp b/src/mongo/client/sdam/server_selector.cpp index 1b24550cea0..5dd58d95684 100644 --- a/src/mongo/client/sdam/server_selector.cpp +++ b/src/mongo/client/sdam/server_selector.cpp @@ -303,7 +303,8 @@ void SdamServerSelector::_verifyMaxstalenessWireVersions(TopologyDescriptionPtr for (auto& server : topologyDescription->getServers()) { uassert(ErrorCodes::IncompatibleServerVersion, "Incompatible wire version", - server->getMaxWireVersion() >= WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); + server->getType() == ServerType::kUnknown || + server->getMaxWireVersion() >= WireVersion::COMMANDS_ACCEPT_WRITE_CONCERN); } } diff --git a/src/mongo/client/sdam/server_selector_test.cpp b/src/mongo/client/sdam/server_selector_test.cpp index 05dfd382904..6287123c8be 100644 --- a/src/mongo/client/sdam/server_selector_test.cpp +++ b/src/mongo/client/sdam/server_selector_test.cpp @@ -177,6 +177,36 @@ TEST_F(ServerSelectorTestFixture, ShouldThrowOnWireError) { ErrorCodes::IncompatibleServerVersion); } +TEST_F(ServerSelectorTestFixture, ShouldNotThrowWireErrorIfOnlyOneServerUnknown) { + TopologyStateMachine stateMachine(sdamConfiguration); + auto topologyDescription = std::make_shared<TopologyDescription>(sdamConfiguration); + auto primary = ServerDescriptionBuilder() + .withAddress(HostAndPort("s0")) + .withType(ServerType::kRSPrimary) + .withLastUpdateTime(Date_t::now()) + .withLastWriteDate(Date_t::now()) + .withRtt(Milliseconds{1}) + .withSetName("set") + .withHost(HostAndPort("s0")) + .withHost(HostAndPort("s1")) + .withMinWireVersion(WireVersion::SUPPORTS_OP_MSG) + .withMaxWireVersion(WireVersion::LATEST_WIRE_VERSION) + .instance(); + stateMachine.onServerDescription(*topologyDescription, primary); + + auto downedServer = ServerDescriptionBuilder().withAddress(HostAndPort("s1")).instance(); + stateMachine.onServerDescription(*topologyDescription, downedServer); + + ASSERT(topologyDescription->isWireVersionCompatible()); + + const auto ninetySeconds = Seconds(90); + const auto readPref = + ReadPreferenceSetting(ReadPreference::Nearest, TagSets::emptySet, ninetySeconds); + auto result = selector.selectServers(topologyDescription, readPref); + ASSERT(result); + ASSERT_EQ(primary->getAddress(), (*result)[0]->getAddress()); +} + TEST_F(ServerSelectorTestFixture, ShouldReturnNoneIfTopologyUnknown) { auto topologyDescription = std::make_shared<TopologyDescription>(sdamConfiguration); ASSERT_EQ(TopologyType::kUnknown, topologyDescription->getType()); |