summaryrefslogtreecommitdiff
path: root/src/mongo/executor/async_rpc_error_info.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/executor/async_rpc_error_info.cpp')
-rw-r--r--src/mongo/executor/async_rpc_error_info.cpp32
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