summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReo Kimura <reo.kimura@mongodb.com>2022-10-03 16:13:56 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-10-03 17:39:02 +0000
commita14665e02e841e43d2bc057e004aeacf0c01c719 (patch)
tree6ebad6eb4f8b4fbebd5659e5cff05fd672535184
parentedd8bd445afa1779fa453b1605f02b94afe6fde3 (diff)
downloadmongo-a14665e02e841e43d2bc057e004aeacf0c01c719.tar.gz
SERVER-67285 Provide context to errorCodeToStatus()
-rw-r--r--src/mongo/transport/asio_utils.cpp26
-rw-r--r--src/mongo/transport/asio_utils.h5
-rw-r--r--src/mongo/transport/asio_utils_test.cpp2
-rw-r--r--src/mongo/transport/session_asio.cpp10
-rw-r--r--src/mongo/transport/session_asio.h10
-rw-r--r--src/mongo/transport/transport_layer_asio.cpp16
6 files changed, 42 insertions, 27 deletions
diff --git a/src/mongo/transport/asio_utils.cpp b/src/mongo/transport/asio_utils.cpp
index a7717764955..b166eeebac3 100644
--- a/src/mongo/transport/asio_utils.cpp
+++ b/src/mongo/transport/asio_utils.cpp
@@ -38,11 +38,23 @@
namespace mongo::transport {
Status errorCodeToStatus(const std::error_code& ec) {
+ return errorCodeToStatus(ec, {});
+}
+
+Status errorCodeToStatus(const std::error_code& ec, StringData context) {
if (!ec)
return Status::OK();
+ // Add additional context string to Status reason if included.
+ auto makeStatus = [&](ErrorCodes::Error code, StringData reason) {
+ Status result(code, reason);
+ if (context.rawData())
+ result.addContext(context);
+ return result;
+ };
+
if (ec == asio::error::operation_aborted) {
- return {ErrorCodes::CallbackCanceled, "Callback was canceled"};
+ return makeStatus(ErrorCodes::CallbackCanceled, "Callback was canceled");
}
#ifdef _WIN32
@@ -50,15 +62,15 @@ Status errorCodeToStatus(const std::error_code& ec) {
#else
if (ec == asio::error::try_again || ec == asio::error::would_block) {
#endif
- return {ErrorCodes::NetworkTimeout, "Socket operation timed out"};
+ return makeStatus(ErrorCodes::NetworkTimeout, "Socket operation timed out");
} else if (ec == asio::error::eof) {
- return {ErrorCodes::HostUnreachable, "Connection closed by peer"};
+ return makeStatus(ErrorCodes::HostUnreachable, "Connection closed by peer");
} else if (ec == asio::error::connection_reset) {
- return {ErrorCodes::HostUnreachable, "Connection reset by peer"};
+ return makeStatus(ErrorCodes::HostUnreachable, "Connection reset by peer");
} else if (ec == asio::error::network_reset) {
- return {ErrorCodes::HostUnreachable, "Connection reset by network"};
+ return makeStatus(ErrorCodes::HostUnreachable, "Connection reset by network");
} else if (ec == asio::error::in_progress) {
- return {ErrorCodes::ConnectionError, "Socket operation in progress"};
+ return makeStatus(ErrorCodes::ConnectionError, "Socket operation in progress");
}
// If the ec.category() is a mongoErrorCategory() then this error was propogated from
@@ -69,7 +81,7 @@ Status errorCodeToStatus(const std::error_code& ec) {
// SocketException
: ErrorCodes::SocketException;
// Either way, include the error message.
- return {errorCode, ec.message()};
+ return makeStatus(errorCode, ec.message());
}
template <typename T>
diff --git a/src/mongo/transport/asio_utils.h b/src/mongo/transport/asio_utils.h
index 7590c3ddfd6..bce3cb708e0 100644
--- a/src/mongo/transport/asio_utils.h
+++ b/src/mongo/transport/asio_utils.h
@@ -129,6 +129,7 @@ inline HostAndPort endpointToHostAndPort(const asio::generic::stream_protocol::e
}
Status errorCodeToStatus(const std::error_code& ec);
+Status errorCodeToStatus(const std::error_code& ec, StringData context);
/**
* The ASIO implementation of poll (i.e. socket.wait()) cannot poll for a mask of events, and
@@ -163,7 +164,7 @@ size_t peekASIOStream(Stream& stream, const MutableBufferSequence& buffers) {
// actually an error condition for our purposes, we ignore these two
// errors.
if (ec != asio::error::would_block && ec != asio::error::try_again) {
- uassertStatusOK(errorCodeToStatus(ec));
+ uassertStatusOK(errorCodeToStatus(ec, "peekASIOStream"));
}
return bytesRead;
@@ -297,7 +298,7 @@ private:
template <typename... As>
void _onInvoke(std::error_code ec, As&&... args) {
if (ec) {
- promise.setError(errorCodeToStatus(ec));
+ promise.setError(errorCodeToStatus(ec, "onInvoke"));
return;
}
_onSuccess(std::forward<As>(args)...);
diff --git a/src/mongo/transport/asio_utils_test.cpp b/src/mongo/transport/asio_utils_test.cpp
index fd96a9bf44b..0cd5c888d67 100644
--- a/src/mongo/transport/asio_utils_test.cpp
+++ b/src/mongo/transport/asio_utils_test.cpp
@@ -116,7 +116,7 @@ auto prepareTCPSocketPair(asio::io_context& io_context) {
{
std::error_code ec;
acceptor.bind(ep, ec);
- uassertStatusOK(errorCodeToStatus(ec));
+ uassertStatusOK(errorCodeToStatus(ec, "prepareTCPSocketPair bind"));
}
acceptor.listen();
diff --git a/src/mongo/transport/session_asio.cpp b/src/mongo/transport/session_asio.cpp
index ad3f934dd8f..0eb3e3eef44 100644
--- a/src/mongo/transport/session_asio.cpp
+++ b/src/mongo/transport/session_asio.cpp
@@ -193,7 +193,7 @@ Status TransportLayerASIO::ASIOSession::waitForData() noexcept try {
ensureSync();
asio::error_code ec;
getSocket().wait(asio::ip::tcp::socket::wait_read, ec);
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "waitForData");
} catch (const DBException& ex) {
return ex.toStatus();
}
@@ -343,7 +343,7 @@ void TransportLayerASIO::ASIOSession::ensureSync() {
asio::error_code ec;
if (_blockingMode != Sync) {
getSocket().non_blocking(false, ec);
- fassert(40490, errorCodeToStatus(ec));
+ fassert(40490, errorCodeToStatus(ec, "ensureSync non_blocking"));
_blockingMode = Sync;
}
@@ -356,14 +356,14 @@ void TransportLayerASIO::ASIOSession::ensureSync() {
"session send timeout",
logv2::LogSeverity::Info(),
ec);
- uassertStatusOK(errorCodeToStatus(ec));
+ uassertStatusOK(errorCodeToStatus(ec, "ensureSync session send timeout"));
setSocketOption(getSocket(),
ASIOSocketTimeoutOption<SO_RCVTIMEO>(timeout),
"session receive timeout",
logv2::LogSeverity::Info(),
ec);
- uassertStatusOK(errorCodeToStatus(ec));
+ uassertStatusOK(errorCodeToStatus(ec, "ensureSync session receive timeout"));
_socketTimeout = _configuredTimeout;
}
@@ -379,7 +379,7 @@ void TransportLayerASIO::ASIOSession::ensureAsync() {
asio::error_code ec;
getSocket().non_blocking(true, ec);
- fassert(50706, errorCodeToStatus(ec));
+ fassert(50706, errorCodeToStatus(ec, "ensureAsync non_blocking"));
_blockingMode = Async;
}
diff --git a/src/mongo/transport/session_asio.h b/src/mongo/transport/session_asio.h
index 6bee5566b98..5ad0579bfc9 100644
--- a/src/mongo/transport/session_asio.h
+++ b/src/mongo/transport/session_asio.h
@@ -59,17 +59,19 @@ extern FailPoint transportLayerASIOSessionPauseBeforeSetSocketOption;
template <typename SuccessValue>
auto futurize(const std::error_code& ec, SuccessValue&& successValue) {
- using Result = Future<std::decay_t<SuccessValue>>;
+ using T = std::decay_t<SuccessValue>;
if (MONGO_unlikely(ec)) {
- return Result::makeReady(errorCodeToStatus(ec));
+ using namespace fmt::literals;
+ static StaticImmortal memo = "futurize<{}>"_format(demangleName(typeid(T)));
+ return Future<T>::makeReady(errorCodeToStatus(ec, *memo));
}
- return Result::makeReady(successValue);
+ return Future<T>::makeReady(std::forward<SuccessValue>(successValue));
}
inline Future<void> futurize(const std::error_code& ec) {
using Result = Future<void>;
if (MONGO_unlikely(ec)) {
- return Result::makeReady(errorCodeToStatus(ec));
+ return Result::makeReady(errorCodeToStatus(ec, "futurize"));
}
return Result::makeReady();
}
diff --git a/src/mongo/transport/transport_layer_asio.cpp b/src/mongo/transport/transport_layer_asio.cpp
index e3e7a3b24e1..7dd788d3f9f 100644
--- a/src/mongo/transport/transport_layer_asio.cpp
+++ b/src/mongo/transport/transport_layer_asio.cpp
@@ -524,7 +524,7 @@ private:
}
if (ec) {
- return _makeFuture(errorCodeToStatus(ec), peer);
+ return _makeFuture(errorCodeToStatus(ec, "resolve"), peer);
} else {
return _makeFuture(results, peer);
}
@@ -716,7 +716,7 @@ StatusWith<TransportLayerASIO::ASIOSessionHandle> TransportLayerASIO::_doSyncCon
logv2::LogSeverity::Info(),
ec);
if (tcpFastOpenIsConfigured) {
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "syncConnect tcpFastOpenIsConfigured");
}
ec = std::error_code();
}
@@ -738,7 +738,7 @@ StatusWith<TransportLayerASIO::ASIOSessionHandle> TransportLayerASIO::_doSyncCon
auto status = [&] {
if (ec) {
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "syncConnect connect error");
} else if (now >= expiration) {
return Status(ErrorCodes::NetworkTimeout, "Timed out");
} else {
@@ -763,7 +763,7 @@ StatusWith<TransportLayerASIO::ASIOSessionHandle> TransportLayerASIO::_doSyncCon
return std::make_shared<ASIOSession>(
this, std::move(sock), false, *endpoint, transientSSLContext);
} catch (const asio::system_error& e) {
- return errorCodeToStatus(e.code());
+ return errorCodeToStatus(e.code(), "syncConnect ASIOSession constructor");
} catch (const DBException& e) {
return e.toStatus();
}
@@ -922,7 +922,7 @@ Future<SessionHandle> TransportLayerASIO::asyncConnect(
*connector->resolvedEndpoint,
transientSSLContext);
} catch (const asio::system_error& e) {
- iasserted(errorCodeToStatus(e.code()));
+ iasserted(errorCodeToStatus(e.code(), "asyncConnect ASIOSession constructor"));
}
}();
connector->session->ensureAsync();
@@ -1245,7 +1245,7 @@ Status TransportLayerASIO::setup() {
logv2::LogSeverity::Info(),
ec);
if (tcpFastOpenIsConfigured) {
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "setup tcpFastOpenIsConfigured");
}
ec = std::error_code();
}
@@ -1257,12 +1257,12 @@ Status TransportLayerASIO::setup() {
acceptor.non_blocking(true, ec);
if (ec) {
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "setup non_blocking");
}
acceptor.bind(*addr, ec);
if (ec) {
- return errorCodeToStatus(ec);
+ return errorCodeToStatus(ec, "setup bind");
}
#ifndef _WIN32