summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Wangensteen <george.wangensteen@mongodb.com>2021-06-16 16:24:08 +0000
committerGeorge Wangensteen <george.wangensteen@mongodb.com>2021-06-23 20:56:44 +0000
commite0a85e5f9942962e67633170fe64d985c6a2b5b9 (patch)
tree25b59a7f3c1b4ff5f117d51ce2f69b5f84099fcb
parent651361eec8e4ee468c33e21dd6f346bf141868b3 (diff)
downloadmongo-e0a85e5f9942962e67633170fe64d985c6a2b5b9.tar.gz
SERVER-49435 Make NetworkInterfaceTL::ExhaustCommandState::sendRequest handle exceptions
(cherry picked from commit 32d4d90cb12b46a57101b5de4e9ba08b5ab50c9e)
-rw-r--r--src/mongo/executor/network_interface_tl.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/mongo/executor/network_interface_tl.cpp b/src/mongo/executor/network_interface_tl.cpp
index b063ae2fa06..8d86e958a34 100644
--- a/src/mongo/executor/network_interface_tl.cpp
+++ b/src/mongo/executor/network_interface_tl.cpp
@@ -900,7 +900,7 @@ auto NetworkInterfaceTL::ExhaustCommandState::make(NetworkInterfaceTL* interface
}
Future<RemoteCommandResponse> NetworkInterfaceTL::ExhaustCommandState::sendRequest(
- std::shared_ptr<RequestState> requestState) {
+ std::shared_ptr<RequestState> requestState) try {
auto [promise, future] = makePromiseFuture<RemoteCommandResponse>();
finalResponsePromise = std::move(promise);
@@ -912,20 +912,20 @@ Future<RemoteCommandResponse> NetworkInterfaceTL::ExhaustCommandState::sendReque
continueExhaustRequest(std::move(requestState), swResponse);
});
return std::move(future).then([this](const auto& finalResponse) { return finalResponse; });
+} catch (const DBException& ex) {
+ return ex.toStatus();
}
void NetworkInterfaceTL::ExhaustCommandState::fulfillFinalPromise(
- StatusWith<RemoteCommandOnAnyResponse> response) {
- auto status = !response.getStatus().isOK()
- ? response.getStatus()
- : getStatusFromCommandResult(response.getValue().data);
-
- if (!status.isOK()) {
- promise.setError(status);
- return;
- }
-
- promise.emplaceValue();
+ StatusWith<RemoteCommandOnAnyResponse> swr) {
+ promise.setFrom([&] {
+ if (!swr.isOK())
+ return swr.getStatus();
+ auto response = swr.getValue();
+ if (!response.isOK())
+ return response.status;
+ return getStatusFromCommandResult(response.data);
+ }());
}
void NetworkInterfaceTL::ExhaustCommandState::continueExhaustRequest(