diff options
Diffstat (limited to 'src/mongo/executor/async_rpc_error_info.cpp')
-rw-r--r-- | src/mongo/executor/async_rpc_error_info.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mongo/executor/async_rpc_error_info.cpp b/src/mongo/executor/async_rpc_error_info.cpp index 8894bb2902e..ab14f6be221 100644 --- a/src/mongo/executor/async_rpc_error_info.cpp +++ b/src/mongo/executor/async_rpc_error_info.cpp @@ -47,4 +47,36 @@ std::shared_ptr<const ErrorExtraInfo> AsyncRPCErrorInfo::parse(const BSONObj& ob void AsyncRPCErrorInfo::serialize(BSONObjBuilder* bob) const {} +namespace async_rpc { + +Status unpackRPCStatus(Status status) { + invariant(status == ErrorCodes::RemoteCommandExecutionError); + auto errorInfo = status.extraInfo<AsyncRPCErrorInfo>(); + if (errorInfo->isLocal()) { + return errorInfo->asLocal(); + } + invariant(errorInfo->isRemote()); + auto remoteError = errorInfo->asRemote(); + Status out = remoteError.getRemoteCommandResult(); + if (out.isOK()) { + out = remoteError.getRemoteCommandWriteConcernError(); + } + if (out.isOK()) { + out = remoteError.getRemoteCommandFirstWriteError(); + } + return out; +} + +Status unpackRPCStatusIgnoringWriteConcernAndWriteErrors(Status status) { + invariant(status == ErrorCodes::RemoteCommandExecutionError); + auto errorInfo = status.extraInfo<AsyncRPCErrorInfo>(); + if (errorInfo->isLocal()) { + return errorInfo->asLocal(); + } + invariant(errorInfo->isRemote()); + auto remoteError = errorInfo->asRemote(); + return remoteError.getRemoteCommandResult(); +} + +} // namespace async_rpc } // namespace mongo |