From a06f4dcdcd5fd900291eaf27fb1e2340eafe3152 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sun, 17 Oct 2021 10:48:09 +0200 Subject: [PATCH] P2PServer: fixed ever growing memory usage --- src/p2p_server.cpp | 29 ++++++++++++++--------------- src/p2p_server.h | 4 ++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index 4987d02..96b15b3 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -640,13 +640,14 @@ void P2PServer::on_broadcast() uint8_t* p = p0; bool send_pruned = true; - { - ReadLock lock(client->m_broadcastedHashesLock); - for (const hash& id : data->ancestor_hashes) { - if (client->m_broadcastedHashes.find(id) == client->m_broadcastedHashes.end()) { - send_pruned = false; - break; - } + + const hash* a = client->m_broadcastedHashes; + const hash* b = client->m_broadcastedHashes + array_size(&P2PClient::m_broadcastedHashes); + + for (const hash& id : data->ancestor_hashes) { + if (std::find(a, b, id) == b) { + send_pruned = false; + break; } } @@ -834,13 +835,12 @@ P2PServer::P2PClient::P2PClient() , m_lastAlive(0) , m_lastBroadcastTimestamp(0) , m_lastBlockrequestTimestamp(0) + , m_broadcastedHashes{} { - uv_rwlock_init_checked(&m_broadcastedHashesLock); } P2PServer::P2PClient::~P2PClient() { - uv_rwlock_destroy(&m_broadcastedHashesLock); } void P2PServer::P2PClient::reset() @@ -860,8 +860,10 @@ void P2PServer::P2PClient::reset() m_lastBroadcastTimestamp = 0; m_lastBlockrequestTimestamp = 0; - WriteLock lock(m_broadcastedHashesLock); - m_broadcastedHashes.clear(); + for (hash& h : m_broadcastedHashes) { + h = {}; + } + m_broadcastedHashesIndex = 0; } bool P2PServer::P2PClient::on_connect() @@ -1487,10 +1489,7 @@ bool P2PServer::P2PClient::on_block_broadcast(const uint8_t* buf, uint32_t size) return false; } - { - WriteLock lock2(m_broadcastedHashesLock); - m_broadcastedHashes.insert(server->m_block->m_sidechainId); - } + m_broadcastedHashes[m_broadcastedHashesIndex.fetch_add(1) % array_size(&P2PClient::m_broadcastedHashes)] = server->m_block->m_sidechainId; const MinerData& miner_data = server->m_pool->miner_data(); diff --git a/src/p2p_server.h b/src/p2p_server.h index 4762460..a598c27 100644 --- a/src/p2p_server.h +++ b/src/p2p_server.h @@ -115,8 +115,8 @@ public: time_t m_lastBroadcastTimestamp; time_t m_lastBlockrequestTimestamp; - uv_rwlock_t m_broadcastedHashesLock; - std::set m_broadcastedHashes; + hash m_broadcastedHashes[8]; + std::atomic m_broadcastedHashesIndex{ 0 }; }; void broadcast(const PoolBlock& block);