@@ -245,6 +245,10 @@ struct Peer {
245
245
double m_addr_token_bucket{1.0 };
246
246
/* * When m_addr_token_bucket was last updated */
247
247
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 };
248
252
249
253
/* * Set of txids to reconsider once their parent transactions have been accepted **/
250
254
std::set<uint256> m_orphan_work_set GUARDED_BY (g_cs_orphans);
@@ -1251,6 +1255,8 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
1251
1255
}
1252
1256
1253
1257
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 ();
1254
1260
1255
1261
return true ;
1256
1262
}
@@ -2804,6 +2810,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
2804
2810
peer->m_addr_token_timestamp = current_time;
2805
2811
2806
2812
const bool rate_limited = !pfrom.HasPermission (NetPermissionFlags::Addr);
2813
+ uint64_t num_proc = 0 ;
2814
+ uint64_t num_rate_limit = 0 ;
2807
2815
Shuffle (vAddr.begin (), vAddr.end (), FastRandomContext ());
2808
2816
for (CAddress& addr : vAddr)
2809
2817
{
@@ -2812,7 +2820,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
2812
2820
2813
2821
// Apply rate limiting.
2814
2822
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
+ }
2816
2827
peer->m_addr_token_bucket -= 1.0 ;
2817
2828
}
2818
2829
// We only bother storing full nodes, though this may include
@@ -2828,6 +2839,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
2828
2839
// Do not process banned/discouraged addresses beyond remembering we received them
2829
2840
continue ;
2830
2841
}
2842
+ ++num_proc;
2831
2843
bool fReachable = IsReachable (addr);
2832
2844
if (addr.nTime > nSince && !peer->m_getaddr_sent && vAddr.size () <= 10 && addr.IsRoutable ()) {
2833
2845
// Relay to a limited number of other nodes
@@ -2837,6 +2849,15 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
2837
2849
if (fReachable )
2838
2850
vAddrOk.push_back (addr);
2839
2851
}
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
+
2840
2861
m_addrman.Add (vAddrOk, pfrom.addr , 2 * 60 * 60 );
2841
2862
if (vAddr.size () < 1000 ) peer->m_getaddr_sent = false ;
2842
2863
if (pfrom.IsAddrFetchConn ()) {
0 commit comments