diff --git a/src/net.cpp b/src/net.cpp index bd183ce52b2..ee9d71786ab 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -601,7 +601,7 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes, bool& complete if (i == mapRecvBytesPerMsgCmd.end()) i = mapRecvBytesPerMsgCmd.find(NET_MESSAGE_COMMAND_OTHER); assert(i != mapRecvBytesPerMsgCmd.end()); - i->second += m_deserializer->hdr.nMessageSize + CMessageHeader::HEADER_SIZE; + i->second += msg.m_raw_message_size; // push the message to the process queue, vRecvMsg.push_back(std::move(msg)); @@ -707,6 +707,7 @@ CNetMessage TransportDeserializer::GetMessage(const CMessageHeader::MessageStart // store command string, payload size msg.m_command = hdr.GetCommand(); msg.m_message_size = hdr.nMessageSize; + msg.m_raw_message_size = hdr.nMessageSize + CMessageHeader::HEADER_SIZE; msg.m_valid_checksum = (memcmp(hash.begin(), hdr.pchChecksum, CMessageHeader::CHECKSUM_SIZE) == 0); if (!msg.m_valid_checksum) { @@ -1377,7 +1378,7 @@ void CConnman::SocketHandler() for (; it != pnode->vRecvMsg.end(); ++it) { // vRecvMsg contains only completed CNetMessage // the single possible partially deserialized message are held by TransportDeserializer - nSizeAdded += it->m_recv.size() + CMessageHeader::HEADER_SIZE; + nSizeAdded += it->m_raw_message_size; } { LOCK(pnode->cs_vProcessMsg); diff --git a/src/net.h b/src/net.h index a9ce33957d4..15996438c9c 100644 --- a/src/net.h +++ b/src/net.h @@ -621,6 +621,7 @@ public: bool m_valid_header = false; bool m_valid_checksum = false; uint32_t m_message_size = 0; // size of the payload + uint32_t m_raw_message_size = 0; // used wire size of the message (including header/checksum) std::string m_command; CNetMessage(const CDataStream& recv_in) : m_recv(std::move(recv_in)) {} diff --git a/src/net_processing.cpp b/src/net_processing.cpp index c8ffbbbe9d7..9496516c377 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3260,7 +3260,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic& inter return false; // Just take one message msgs.splice(msgs.begin(), pfrom->vProcessMsg, pfrom->vProcessMsg.begin()); - pfrom->nProcessQueueSize -= msgs.front().m_recv.size() + CMessageHeader::HEADER_SIZE; + pfrom->nProcessQueueSize -= msgs.front().m_raw_message_size; pfrom->fPauseRecv = pfrom->nProcessQueueSize > connman->GetReceiveFloodSize(); fMoreWork = !pfrom->vProcessMsg.empty(); }