diff --git a/src/net_processing.h b/src/net_processing.h --- a/src/net_processing.h +++ b/src/net_processing.h @@ -43,6 +43,8 @@ int m_starting_height = -1; std::chrono::microseconds m_ping_wait; std::vector vHeightInFlight; + uint64_t m_addr_processed = 0; + uint64_t m_addr_rate_limited = 0; }; class PeerManager : public CValidationInterface, public NetEventsInterface { diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -409,6 +409,13 @@ /** When m_addr_token_bucket was last updated */ std::chrono::microseconds m_addr_token_timestamp{ GetTime()}; + /** Total number of addresses that were dropped due to rate limiting. */ + std::atomic m_addr_rate_limited{0}; + /** + * Total number of addresses that were processed (excludes rate limited + * ones). + */ + std::atomic m_addr_processed{0}; /** * Set of txids to reconsider once their parent transactions have been @@ -1623,6 +1630,8 @@ } stats.m_ping_wait = ping_wait; + stats.m_addr_processed = peer->m_addr_processed.load(); + stats.m_addr_rate_limited = peer->m_addr_rate_limited.load(); return true; } @@ -3688,6 +3697,8 @@ const bool rate_limited = !pfrom.HasPermission(NetPermissionFlags::PF_ADDR); + uint64_t num_proc = 0; + uint64_t num_rate_limit = 0; Shuffle(vAddr.begin(), vAddr.end(), FastRandomContext()); for (CAddress &addr : vAddr) { if (interruptMsgProc) { @@ -3697,7 +3708,8 @@ // Apply rate limiting. if (rate_limited) { if (peer->m_addr_token_bucket < 1.0) { - break; + ++num_rate_limit; + continue; } peer->m_addr_token_bucket -= 1.0; } @@ -3720,6 +3732,7 @@ // remembering we received them continue; } + ++num_proc; bool fReachable = IsReachable(addr); if (addr.nTime > nSince && !peer->m_getaddr_sent && vAddr.size() <= 10 && addr.IsRoutable()) { @@ -3731,6 +3744,13 @@ vAddrOk.push_back(addr); } } + peer->m_addr_processed += num_proc; + peer->m_addr_rate_limited += num_rate_limit; + LogPrint(BCLog::NET, + "Received addr: %u addresses (%u processed, %u rate-limited) " + "from peer=%d%s\n", + vAddr.size(), num_proc, num_rate_limit, pfrom.GetId(), + fLogIPs ? ", peeraddr=" + pfrom.addr.ToString() : ""); m_connman.AddNewAddresses(vAddrOk, pfrom.addr, 2 * 60 * 60); if (vAddr.size() < 1000) { diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -281,6 +281,9 @@ heights.push_back(height); } obj.pushKV("inflight", heights); + obj.pushKV("addr_processed", statestats.m_addr_processed); + obj.pushKV("addr_rate_limited", + statestats.m_addr_rate_limited); } if (IsDeprecatedRPCEnabled(gArgs, "whitelisted")) { // whitelisted is deprecated in v0.24.7 for removal in v0.25