mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-04-29 23:09:44 -04:00
Add logging and addr rate limiting statistics
Includes logging improvements by Vasil Dimov and John Newbery.
This commit is contained in:
parent
b4ece8a1cd
commit
f424d601e1
3 changed files with 26 additions and 1 deletions
|
@ -245,6 +245,10 @@ struct Peer {
|
||||||
double m_addr_token_bucket{1.0};
|
double m_addr_token_bucket{1.0};
|
||||||
/** When m_addr_token_bucket was last updated */
|
/** When m_addr_token_bucket was last updated */
|
||||||
std::chrono::microseconds m_addr_token_timestamp{GetTime<std::chrono::microseconds>()};
|
std::chrono::microseconds m_addr_token_timestamp{GetTime<std::chrono::microseconds>()};
|
||||||
|
/** Total number of addresses that were dropped due to rate limiting. */
|
||||||
|
std::atomic<uint64_t> m_addr_rate_limited{0};
|
||||||
|
/** Total number of addresses that were processed (excludes rate limited ones). */
|
||||||
|
std::atomic<uint64_t> m_addr_processed{0};
|
||||||
|
|
||||||
/** Set of txids to reconsider once their parent transactions have been accepted **/
|
/** Set of txids to reconsider once their parent transactions have been accepted **/
|
||||||
std::set<uint256> m_orphan_work_set GUARDED_BY(g_cs_orphans);
|
std::set<uint256> m_orphan_work_set GUARDED_BY(g_cs_orphans);
|
||||||
|
@ -1251,6 +1255,8 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
|
||||||
}
|
}
|
||||||
|
|
||||||
stats.m_ping_wait = ping_wait;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2804,6 +2810,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
peer->m_addr_token_timestamp = current_time;
|
peer->m_addr_token_timestamp = current_time;
|
||||||
|
|
||||||
const bool rate_limited = !pfrom.HasPermission(NetPermissionFlags::Addr);
|
const bool rate_limited = !pfrom.HasPermission(NetPermissionFlags::Addr);
|
||||||
|
uint64_t num_proc = 0;
|
||||||
|
uint64_t num_rate_limit = 0;
|
||||||
Shuffle(vAddr.begin(), vAddr.end(), FastRandomContext());
|
Shuffle(vAddr.begin(), vAddr.end(), FastRandomContext());
|
||||||
for (CAddress& addr : vAddr)
|
for (CAddress& addr : vAddr)
|
||||||
{
|
{
|
||||||
|
@ -2812,7 +2820,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
|
|
||||||
// Apply rate limiting.
|
// Apply rate limiting.
|
||||||
if (rate_limited) {
|
if (rate_limited) {
|
||||||
if (peer->m_addr_token_bucket < 1.0) break;
|
if (peer->m_addr_token_bucket < 1.0) {
|
||||||
|
++num_rate_limit;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
peer->m_addr_token_bucket -= 1.0;
|
peer->m_addr_token_bucket -= 1.0;
|
||||||
}
|
}
|
||||||
// We only bother storing full nodes, though this may include
|
// We only bother storing full nodes, though this may include
|
||||||
|
@ -2828,6 +2839,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
// Do not process banned/discouraged addresses beyond remembering we received them
|
// Do not process banned/discouraged addresses beyond remembering we received them
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
++num_proc;
|
||||||
bool fReachable = IsReachable(addr);
|
bool fReachable = IsReachable(addr);
|
||||||
if (addr.nTime > nSince && !peer->m_getaddr_sent && vAddr.size() <= 10 && addr.IsRoutable()) {
|
if (addr.nTime > nSince && !peer->m_getaddr_sent && vAddr.size() <= 10 && addr.IsRoutable()) {
|
||||||
// Relay to a limited number of other nodes
|
// Relay to a limited number of other nodes
|
||||||
|
@ -2837,6 +2849,15 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
if (fReachable)
|
if (fReachable)
|
||||||
vAddrOk.push_back(addr);
|
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_addrman.Add(vAddrOk, pfrom.addr, 2 * 60 * 60);
|
m_addrman.Add(vAddrOk, pfrom.addr, 2 * 60 * 60);
|
||||||
if (vAddr.size() < 1000) peer->m_getaddr_sent = false;
|
if (vAddr.size() < 1000) peer->m_getaddr_sent = false;
|
||||||
if (pfrom.IsAddrFetchConn()) {
|
if (pfrom.IsAddrFetchConn()) {
|
||||||
|
|
|
@ -29,6 +29,8 @@ struct CNodeStateStats {
|
||||||
int m_starting_height = -1;
|
int m_starting_height = -1;
|
||||||
std::chrono::microseconds m_ping_wait;
|
std::chrono::microseconds m_ping_wait;
|
||||||
std::vector<int> vHeightInFlight;
|
std::vector<int> vHeightInFlight;
|
||||||
|
uint64_t m_addr_processed = 0;
|
||||||
|
uint64_t m_addr_rate_limited = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PeerManager : public CValidationInterface, public NetEventsInterface
|
class PeerManager : public CValidationInterface, public NetEventsInterface
|
||||||
|
|
|
@ -242,6 +242,8 @@ static RPCHelpMan getpeerinfo()
|
||||||
heights.push_back(height);
|
heights.push_back(height);
|
||||||
}
|
}
|
||||||
obj.pushKV("inflight", heights);
|
obj.pushKV("inflight", heights);
|
||||||
|
obj.pushKV("addr_processed", statestats.m_addr_processed);
|
||||||
|
obj.pushKV("addr_rate_limited", statestats.m_addr_rate_limited);
|
||||||
}
|
}
|
||||||
UniValue permissions(UniValue::VARR);
|
UniValue permissions(UniValue::VARR);
|
||||||
for (const auto& permission : NetPermissions::ToStrings(stats.m_permissionFlags)) {
|
for (const auto& permission : NetPermissions::ToStrings(stats.m_permissionFlags)) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue