summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2021-06-09 03:33:38 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-06-09 03:57:55 +0000
commitf9947fe6a9f8066fff5dc4bc646683e15ea0121a (patch)
treeb53615b34303479f98b0f088d1babcb405424827
parent047e62422aeb20f6a5bd476ed970d4deb8235237 (diff)
downloadmongo-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.cpp25
-rw-r--r--src/mongo/client/sdam/server_selector.cpp3
-rw-r--r--src/mongo/client/sdam/server_selector_test.cpp30
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());