mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 18:53:23 -03:00
[net processing] Move ping timeout logic to net processing
Ping messages are an application-level mechanism. Move timeout logic from net to net processing.
This commit is contained in:
parent
0b43b81f69
commit
dd2646d12c
2 changed files with 18 additions and 11 deletions
|
@ -1247,14 +1247,6 @@ bool CConnman::InactivityCheck(const CNode& node) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.nPingNonceSent && node.m_ping_start.load() + std::chrono::seconds{TIMEOUT_INTERVAL} < GetTime<std::chrono::microseconds>()) {
|
|
||||||
// We use mockable time for ping timeouts. This means that setmocktime
|
|
||||||
// may cause pings to time out for peers that have been connected for
|
|
||||||
// longer than m_peer_connect_timeout.
|
|
||||||
LogPrint(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(GetTime<std::chrono::microseconds>() - node.m_ping_start.load()), node.GetId());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!node.fSuccessfullyConnected) {
|
if (!node.fSuccessfullyConnected) {
|
||||||
LogPrint(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
|
LogPrint(BCLog::NET, "version handshake timeout peer=%d\n", node.GetId());
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -324,7 +324,8 @@ private:
|
||||||
/** Send a version message to a peer */
|
/** Send a version message to a peer */
|
||||||
void PushNodeVersion(CNode& pnode, int64_t nTime);
|
void PushNodeVersion(CNode& pnode, int64_t nTime);
|
||||||
|
|
||||||
/** Send a ping message every PING_INTERVAL or if requested via RPC. */
|
/** Send a ping message every PING_INTERVAL or if requested via RPC. May
|
||||||
|
* mark the peer to be disconnected if a ping has timed out. */
|
||||||
void MaybeSendPing(CNode& node_to);
|
void MaybeSendPing(CNode& node_to);
|
||||||
|
|
||||||
const CChainParams& m_chainparams;
|
const CChainParams& m_chainparams;
|
||||||
|
@ -4297,6 +4298,17 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
|
||||||
|
|
||||||
void PeerManagerImpl::MaybeSendPing(CNode& node_to)
|
void PeerManagerImpl::MaybeSendPing(CNode& node_to)
|
||||||
{
|
{
|
||||||
|
// Use mockable time for ping timeouts.
|
||||||
|
// This means that setmocktime may cause pings to time out.
|
||||||
|
auto now = GetTime<std::chrono::microseconds>();
|
||||||
|
|
||||||
|
if (m_connman.RunInactivityChecks(node_to) && node_to.nPingNonceSent &&
|
||||||
|
now > node_to.m_ping_start.load() + std::chrono::seconds{TIMEOUT_INTERVAL}) {
|
||||||
|
LogPrint(BCLog::NET, "ping timeout: %fs peer=%d\n", 0.000001 * count_microseconds(now - node_to.m_ping_start.load()), node_to.GetId());
|
||||||
|
node_to.fDisconnect = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const CNetMsgMaker msgMaker(node_to.GetCommonVersion());
|
const CNetMsgMaker msgMaker(node_to.GetCommonVersion());
|
||||||
bool pingSend = false;
|
bool pingSend = false;
|
||||||
|
|
||||||
|
@ -4305,7 +4317,7 @@ void PeerManagerImpl::MaybeSendPing(CNode& node_to)
|
||||||
pingSend = true;
|
pingSend = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node_to.nPingNonceSent == 0 && node_to.m_ping_start.load() + PING_INTERVAL < GetTime<std::chrono::microseconds>()) {
|
if (node_to.nPingNonceSent == 0 && now > node_to.m_ping_start.load() + PING_INTERVAL) {
|
||||||
// Ping automatically sent as a latency probe & keepalive.
|
// Ping automatically sent as a latency probe & keepalive.
|
||||||
pingSend = true;
|
pingSend = true;
|
||||||
}
|
}
|
||||||
|
@ -4316,7 +4328,7 @@ void PeerManagerImpl::MaybeSendPing(CNode& node_to)
|
||||||
GetRandBytes((unsigned char*)&nonce, sizeof(nonce));
|
GetRandBytes((unsigned char*)&nonce, sizeof(nonce));
|
||||||
}
|
}
|
||||||
node_to.fPingQueued = false;
|
node_to.fPingQueued = false;
|
||||||
node_to.m_ping_start = GetTime<std::chrono::microseconds>();
|
node_to.m_ping_start = now;
|
||||||
if (node_to.GetCommonVersion() > BIP0031_VERSION) {
|
if (node_to.GetCommonVersion() > BIP0031_VERSION) {
|
||||||
node_to.nPingNonceSent = nonce;
|
node_to.nPingNonceSent = nonce;
|
||||||
m_connman.PushMessage(&node_to, msgMaker.Make(NetMsgType::PING, nonce));
|
m_connman.PushMessage(&node_to, msgMaker.Make(NetMsgType::PING, nonce));
|
||||||
|
@ -4368,6 +4380,9 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
|
|
||||||
MaybeSendPing(*pto);
|
MaybeSendPing(*pto);
|
||||||
|
|
||||||
|
// MaybeSendPing may have marked peer for disconnection
|
||||||
|
if (pto->fDisconnect) return true;
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue