From d22a234ed270286b483aec2db1e2f716b9756231 Mon Sep 17 00:00:00 2001 From: laanwj <126646+laanwj@users.noreply.github.com> Date: Sun, 27 Oct 2024 09:05:20 +0100 Subject: [PATCH] net: Use actual memory size in receive buffer accounting Add a method CNetMessage::GetMemoryUsage and use this for accounting of the size of the process receive queue instead of the raw message size. This ensures that allocation and deserialization overhead is taken into account. --- src/net.cpp | 9 +++++++-- src/net.h | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 3e936b5f3def7..f1ac681b998ee 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -124,6 +124,11 @@ size_t CSerializedNetMsg::GetMemoryUsage() const noexcept return sizeof(*this) + memusage::DynamicUsage(m_type) + memusage::DynamicUsage(data); } +size_t CNetMessage::GetMemoryUsage() const noexcept +{ + return sizeof(*this) + memusage::DynamicUsage(m_type) + m_recv.GetMemoryUsage(); +} + void CConnman::AddAddrFetch(const std::string& strDest) { LOCK(m_addr_fetches_mutex); @@ -3769,7 +3774,7 @@ void CNode::MarkReceivedMsgsForProcessing() for (const auto& msg : vRecvMsg) { // vRecvMsg contains only completed CNetMessage // the single possible partially deserialized message are held by TransportDeserializer - nSizeAdded += msg.m_raw_message_size; + nSizeAdded += msg.GetMemoryUsage(); } LOCK(m_msg_process_queue_mutex); @@ -3786,7 +3791,7 @@ std::optional> CNode::PollMessage() std::list msgs; // Just take one message msgs.splice(msgs.begin(), m_msg_process_queue, m_msg_process_queue.begin()); - m_msg_process_queue_size -= msgs.front().m_raw_message_size; + m_msg_process_queue_size -= msgs.front().GetMemoryUsage(); fPauseRecv = m_msg_process_queue_size > m_recv_flood_size; return std::make_pair(std::move(msgs.front()), !m_msg_process_queue.empty()); diff --git a/src/net.h b/src/net.h index 6b63e2cc0d11f..20c654c34abfc 100644 --- a/src/net.h +++ b/src/net.h @@ -245,6 +245,9 @@ class CNetMessage CNetMessage(const CNetMessage&) = delete; CNetMessage& operator=(CNetMessage&&) = default; CNetMessage& operator=(const CNetMessage&) = delete; + + /** Compute total memory usage of this object (own memory + any dynamic memory). */ + size_t GetMemoryUsage() const noexcept; }; /** The Transport converts one connection's sent messages to wire bytes, and received bytes back. */