Skip to content

Commit 32b191f

Browse files
author
MarcoFalke
committed
Merge #20927: [refactor] [net] Clean up InactivityCheck()
bf100f8 [net] Cleanup InactivityChecks() and add commenting about time (John Newbery) 06fa85c [net] InactivityCheck() takes a CNode reference (John Newbery) Pull request description: This is a pure refactor and should not change any behavior. It clarifies and documents the InactivityCheck() function This makes #20721 easier to review. In particular, this function uses a mixture of (unmockable) system time and mockable time. It's important to understand where those are being used when reviewing #20721. #20721 doesn't require this change, so if others don't agree that it's useful and makes review easier, then I'm happy to close this and just do #20721 directly. ACKs for top commit: fanquake: ACK bf100f8 MarcoFalke: review ACK bf100f8 💫 Tree-SHA512: 7b001de2a5fbe8a6dc37baeae930db5775290afb2e8a6aecdf13161f1e5b06ef813bc6291d8ee5cefcf1e430c955ea702833a8db84192eebe6e6acf0b9304cb2
2 parents b7e12b3 + bf100f8 commit 32b191f

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
lines changed

src/net.cpp

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,37 +1216,47 @@ void CConnman::NotifyNumConnectionsChanged()
12161216
}
12171217
}
12181218

1219-
void CConnman::InactivityCheck(CNode *pnode) const
1219+
bool CConnman::InactivityCheck(const CNode& node) const
12201220
{
1221-
int64_t nTime = GetSystemTimeInSeconds();
1222-
if (nTime - pnode->nTimeConnected > m_peer_connect_timeout)
1223-
{
1224-
if (pnode->nLastRecv == 0 || pnode->nLastSend == 0)
1225-
{
1226-
LogPrint(BCLog::NET, "socket no message in first %i seconds, %d %d from %d\n", m_peer_connect_timeout, pnode->nLastRecv != 0, pnode->nLastSend != 0, pnode->GetId());
1227-
pnode->fDisconnect = true;
1228-
}
1229-
else if (nTime - pnode->nLastSend > TIMEOUT_INTERVAL)
1230-
{
1231-
LogPrintf("socket sending timeout: %is\n", nTime - pnode->nLastSend);
1232-
pnode->fDisconnect = true;
1233-
}
1234-
else if (nTime - pnode->nLastRecv > TIMEOUT_INTERVAL)
1235-
{
1236-
LogPrintf("socket receive timeout: %is\n", nTime - pnode->nLastRecv);
1237-
pnode->fDisconnect = true;
1238-
}
1239-
else if (pnode->nPingNonceSent && pnode->m_ping_start.load() + std::chrono::seconds{TIMEOUT_INTERVAL} < GetTime<std::chrono::microseconds>())
1240-
{
1241-
LogPrintf("ping timeout: %fs\n", 0.000001 * count_microseconds(GetTime<std::chrono::microseconds>() - pnode->m_ping_start.load()));
1242-
pnode->fDisconnect = true;
1243-
}
1244-
else if (!pnode->fSuccessfullyConnected)
1245-
{
1246-
LogPrint(BCLog::NET, "version handshake timeout from %d\n", pnode->GetId());
1247-
pnode->fDisconnect = true;
1248-
}
1221+
// Use non-mockable system time (otherwise these timers will pop when we
1222+
// use setmocktime in the tests).
1223+
int64_t now = GetSystemTimeInSeconds();
1224+
1225+
if (now <= node.nTimeConnected + m_peer_connect_timeout) {
1226+
// Only run inactivity checks if the peer has been connected longer
1227+
// than m_peer_connect_timeout.
1228+
return false;
12491229
}
1230+
1231+
if (node.nLastRecv == 0 || node.nLastSend == 0) {
1232+
LogPrint(BCLog::NET, "socket no message in first %i seconds, %d %d from %d\n", m_peer_connect_timeout, node.nLastRecv != 0, node.nLastSend != 0, node.GetId());
1233+
return true;
1234+
}
1235+
1236+
if (now > node.nLastSend + TIMEOUT_INTERVAL) {
1237+
LogPrintf("socket sending timeout: %is\n", now - node.nLastSend);
1238+
return true;
1239+
}
1240+
1241+
if (now > node.nLastRecv + TIMEOUT_INTERVAL) {
1242+
LogPrintf("socket receive timeout: %is\n", now - node.nLastRecv);
1243+
return true;
1244+
}
1245+
1246+
if (node.nPingNonceSent && node.m_ping_start.load() + std::chrono::seconds{TIMEOUT_INTERVAL} < GetTime<std::chrono::microseconds>()) {
1247+
// We use mockable time for ping timeouts. This means that setmocktime
1248+
// may cause pings to time out for peers that have been connected for
1249+
// longer than m_peer_connect_timeout.
1250+
LogPrintf("ping timeout: %fs\n", 0.000001 * count_microseconds(GetTime<std::chrono::microseconds>() - node.m_ping_start.load()));
1251+
return true;
1252+
}
1253+
1254+
if (!node.fSuccessfullyConnected) {
1255+
LogPrint(BCLog::NET, "version handshake timeout from %d\n", node.GetId());
1256+
return true;
1257+
}
1258+
1259+
return false;
12501260
}
12511261

12521262
bool CConnman::GenerateSelectSet(std::set<SOCKET> &recv_set, std::set<SOCKET> &send_set, std::set<SOCKET> &error_set)
@@ -1522,7 +1532,7 @@ void CConnman::SocketHandler()
15221532
if (bytes_sent) RecordBytesSent(bytes_sent);
15231533
}
15241534

1525-
InactivityCheck(pnode);
1535+
if (InactivityCheck(*pnode)) pnode->fDisconnect = true;
15261536
}
15271537
{
15281538
LOCK(cs_vNodes);

src/net.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,8 @@ class CConnman
10441044
void AcceptConnection(const ListenSocket& hListenSocket);
10451045
void DisconnectNodes();
10461046
void NotifyNumConnectionsChanged();
1047-
void InactivityCheck(CNode *pnode) const;
1047+
/** Return true if the peer is inactive and should be disconnected. */
1048+
bool InactivityCheck(const CNode& node) const;
10481049
bool GenerateSelectSet(std::set<SOCKET> &recv_set, std::set<SOCKET> &send_set, std::set<SOCKET> &error_set);
10491050
void SocketEvents(std::set<SOCKET> &recv_set, std::set<SOCKET> &send_set, std::set<SOCKET> &error_set);
10501051
void SocketHandler();

0 commit comments

Comments
 (0)