diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index 84fbd36d32..61049579c5 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -379,7 +379,7 @@ ConnectAttempt::processResponse() auto const result = overlay_.peerFinder().activate( slot_, publicKey, static_cast(member)); if (result != PeerFinder::Result::success) - return fail("Outbound slots full"); + return fail("Outbound " + std::string(to_string(result))); auto const peer = std::make_shared( app_, diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index 53b4cad646..874f951f56 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -41,8 +42,6 @@ #include -#include "xrpld/overlay/detail/TrafficCount.h" - namespace ripple { namespace CrawlOptions { @@ -269,8 +268,8 @@ OverlayImpl::onHandoff( if (result != PeerFinder::Result::success) { m_peerFinder->on_closed(slot); - JLOG(journal.debug()) - << "Peer " << remote_endpoint << " redirected, slots full"; + JLOG(journal.debug()) << "Peer " << remote_endpoint + << " redirected, " << to_string(result); handoff.moved = false; handoff.response = makeRedirectResponse( slot, request, remote_endpoint.address()); diff --git a/src/xrpld/peerfinder/PeerfinderManager.h b/src/xrpld/peerfinder/PeerfinderManager.h index a670fb8780..f399251c38 100644 --- a/src/xrpld/peerfinder/PeerfinderManager.h +++ b/src/xrpld/peerfinder/PeerfinderManager.h @@ -28,6 +28,8 @@ #include +#include + namespace ripple { namespace PeerFinder { @@ -136,6 +138,36 @@ using Endpoints = std::vector; /** Possible results from activating a slot. */ enum class Result { duplicate, full, success }; +/** + * @brief Converts a `Result` enum value to its string representation. + * + * This function provides a human-readable string for a given `Result` enum, + * which is useful for logging, debugging, or displaying status messages. + * + * @param result The `Result` enum value to convert. + * @return A `std::string_view` representing the enum value. Returns "unknown" + * if the enum value is not explicitly handled. + * + * @note This function returns a `std::string_view` for performance. + * A `std::string` would need to allocate memory on the heap and copy the + * string literal into it every time the function is called. + */ +inline std::string_view +to_string(Result result) noexcept +{ + switch (result) + { + case Result::success: + return "success"; + case Result::duplicate: + return "duplicate connection"; + case Result::full: + return "slots full"; + } + + return "unknown"; +} + /** Maintains a set of IP addresses used for getting into the network. */ class Manager : public beast::PropertyStream::Source {