summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjannaerin <golden.janna@gmail.com>2020-06-30 17:21:35 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-07-09 16:00:44 +0000
commitc8e9a31cd3c21b7b40864e39323fbf0823f79f61 (patch)
tree1008c2a1f7e782e5fd0786dab111621fd31b1f43
parentd197778348a350c5b2378038c6f1fd3a9431d539 (diff)
downloadmongo-c8e9a31cd3c21b7b40864e39323fbf0823f79f61.tar.gz
SERVER-48506 Throw MaxTimeMSExpired instead of FailedToSatisfyReadPreference when RSM deadline is less than max
-rw-r--r--src/mongo/client/remote_command_targeter_rs.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/mongo/client/remote_command_targeter_rs.cpp b/src/mongo/client/remote_command_targeter_rs.cpp
index 69671fc5d06..ce84a13e028 100644
--- a/src/mongo/client/remote_command_targeter_rs.cpp
+++ b/src/mongo/client/remote_command_targeter_rs.cpp
@@ -84,10 +84,18 @@ StatusWith<HostAndPort> RemoteCommandTargeterRS::findHost(OperationContext* opCt
// Enforce a 20-second ceiling on the time spent looking for a host. This conforms with the
// behavior used throughout mongos prior to version 3.4, but is not fundamentally desirable.
// See comment in remote_command_targeter.h for details.
- return _rsMonitor
- ->getHostOrRefresh(readPref,
- std::min<Milliseconds>(opCtx->getRemainingMaxTimeMillis(), Seconds(20)))
- .getNoThrow(opCtx);
+ bool maxTimeMsLesser = (opCtx->getRemainingMaxTimeMillis() < Milliseconds(Seconds(20)));
+ auto swHostAndPort =
+ _rsMonitor
+ ->getHostOrRefresh(
+ readPref, std::min(opCtx->getRemainingMaxTimeMillis(), Milliseconds(Seconds(20))))
+ .getNoThrow(opCtx);
+
+ if (maxTimeMsLesser && swHostAndPort.getStatus() == ErrorCodes::FailedToSatisfyReadPreference) {
+ return Status(ErrorCodes::MaxTimeMSExpired, "operation timed out");
+ }
+
+ return swHostAndPort;
}
void RemoteCommandTargeterRS::markHostNotMaster(const HostAndPort& host, const Status& status) {