diff options
author | jannaerin <golden.janna@gmail.com> | 2020-06-30 17:21:35 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-07-09 16:00:44 +0000 |
commit | c8e9a31cd3c21b7b40864e39323fbf0823f79f61 (patch) | |
tree | 1008c2a1f7e782e5fd0786dab111621fd31b1f43 | |
parent | d197778348a350c5b2378038c6f1fd3a9431d539 (diff) | |
download | mongo-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.cpp | 16 |
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) { |