Skip to content

Commit f424d60

Browse files
committed
Add logging and addr rate limiting statistics
Includes logging improvements by Vasil Dimov and John Newbery.
1 parent b4ece8a commit f424d60

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

src/net_processing.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,10 @@ struct Peer {
245245
double m_addr_token_bucket{1.0};
246246
/** When m_addr_token_bucket was last updated */
247247
std::chrono::microseconds m_addr_token_timestamp{GetTime<std::chrono::microseconds>()};
248+
/** Total number of addresses that were dropped due to rate limiting. */
249+
std::atomic<uint64_t> m_addr_rate_limited{0};
250+
/** Total number of addresses that were processed (excludes rate limited ones). */
251+
std::atomic<uint64_t> m_addr_processed{0};
248252

249253
/** Set of txids to reconsider once their parent transactions have been accepted **/
250254
std::set<uint256> m_orphan_work_set GUARDED_BY(g_cs_orphans);
@@ -1251,6 +1255,8 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
12511255
}
12521256

12531257
stats.m_ping_wait = ping_wait;
1258+
stats.m_addr_processed = peer->m_addr_processed.load();
1259+
stats.m_addr_rate_limited = peer->m_addr_rate_limited.load();
12541260

12551261
return true;
12561262
}
@@ -2804,6 +2810,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
28042810
peer->m_addr_token_timestamp = current_time;
28052811

28062812
const bool rate_limited = !pfrom.HasPermission(NetPermissionFlags::Addr);
2813+
uint64_t num_proc = 0;
2814+
uint64_t num_rate_limit = 0;
28072815
Shuffle(vAddr.begin(), vAddr.end(), FastRandomContext());
28082816
for (CAddress& addr : vAddr)
28092817
{
@@ -2812,7 +2820,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
28122820

28132821
// Apply rate limiting.
28142822
if (rate_limited) {
2815-
if (peer->m_addr_token_bucket < 1.0) break;
2823+
if (peer->m_addr_token_bucket < 1.0) {
2824+
++num_rate_limit;
2825+
continue;
2826+
}
28162827
peer->m_addr_token_bucket -= 1.0;
28172828
}
28182829
// We only bother storing full nodes, though this may include
@@ -2828,6 +2839,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
28282839
// Do not process banned/discouraged addresses beyond remembering we received them
28292840
continue;
28302841
}
2842+
++num_proc;
28312843
bool fReachable = IsReachable(addr);
28322844
if (addr.nTime > nSince && !peer->m_getaddr_sent && vAddr.size() <= 10 && addr.IsRoutable()) {
28332845
// Relay to a limited number of other nodes
@@ -2837,6 +2849,15 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
28372849
if (fReachable)
28382850
vAddrOk.push_back(addr);
28392851
}
2852+
peer->m_addr_processed += num_proc;
2853+
peer->m_addr_rate_limited += num_rate_limit;
2854+
LogPrint(BCLog::NET, "Received addr: %u addresses (%u processed, %u rate-limited) from peer=%d%s\n",
2855+
vAddr.size(),
2856+
num_proc,
2857+
num_rate_limit,
2858+
pfrom.GetId(),
2859+
fLogIPs ? ", peeraddr=" + pfrom.addr.ToString() : "");
2860+
28402861
m_addrman.Add(vAddrOk, pfrom.addr, 2 * 60 * 60);
28412862
if (vAddr.size() < 1000) peer->m_getaddr_sent = false;
28422863
if (pfrom.IsAddrFetchConn()) {

src/net_processing.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ struct CNodeStateStats {
2929
int m_starting_height = -1;
3030
std::chrono::microseconds m_ping_wait;
3131
std::vector<int> vHeightInFlight;
32+
uint64_t m_addr_processed = 0;
33+
uint64_t m_addr_rate_limited = 0;
3234
};
3335

3436
class PeerManager : public CValidationInterface, public NetEventsInterface

src/rpc/net.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ static RPCHelpMan getpeerinfo()
242242
heights.push_back(height);
243243
}
244244
obj.pushKV("inflight", heights);
245+
obj.pushKV("addr_processed", statestats.m_addr_processed);
246+
obj.pushKV("addr_rate_limited", statestats.m_addr_rate_limited);
245247
}
246248
UniValue permissions(UniValue::VARR);
247249
for (const auto& permission : NetPermissions::ToStrings(stats.m_permissionFlags)) {

0 commit comments

Comments
 (0)