diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2021-06-09 03:33:38 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-06-09 03:57:55 +0000 |
commit | f9947fe6a9f8066fff5dc4bc646683e15ea0121a (patch) | |
tree | b53615b34303479f98b0f088d1babcb405424827 | |
parent | 047e62422aeb20f6a5bd476ed970d4deb8235237 (diff) | |
download | mongo-f9947fe6a9f8066fff5dc4bc646683e15ea0121a.tar.gz |
SERVER-57136 Skip maxStaleness wire version check when server is down.
(cherry picked from commit d7bd51c05a7ac49afd7ed3b394fde123383af6de)
-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()); |