diff options
-rw-r--r-- | src/mongo/transport/asio_utils.cpp | 26 | ||||
-rw-r--r-- | src/mongo/transport/asio_utils.h | 5 | ||||
-rw-r--r-- | src/mongo/transport/asio_utils_test.cpp | 2 | ||||
-rw-r--r-- | src/mongo/transport/session_asio.cpp | 10 | ||||
-rw-r--r-- | src/mongo/transport/session_asio.h | 10 | ||||
-rw-r--r-- | src/mongo/transport/transport_layer_asio.cpp | 16 |
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 |