mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-21 15:50:07 +01:00
Merge bitcoin/bitcoin#34025: net: Waste less time in socket handling
5f5c1ea019net: Cache -capturemessages setting (Anthony Towns)cea443e246net: Pass time to InactivityChecks fuctions (Anthony Towns) Pull request description: Cuts out some wasted time in net socket handling. First, only calculates the current time once every 50ms, rather than once for each peer, which given we only care about second-level precision seems more than adequate. Second, caches the value of the `-capturemessages` setting in `CConnman` rather than re-evaluating it every time we invoke `PushMessaage`. ACKs for top commit: maflcko: review ACK5f5c1ea019🏣 vasild: ACK5f5c1ea019sedited: ACK5f5c1ea019mzumsande: ACK5f5c1ea019Tree-SHA512: 0194143a3a4481c6355ac9eab27ce6ae4bed5db1d483ba5d06288dd92f195ccb9f0f055a9eb9d7e16e9bbf72f145eca1ff17c6700ee9aa42730103a8f047b32c
This commit is contained in:
15
src/net.cpp
15
src/net.cpp
@@ -2000,16 +2000,15 @@ void CConnman::NotifyNumConnectionsChanged()
|
||||
}
|
||||
}
|
||||
|
||||
bool CConnman::ShouldRunInactivityChecks(const CNode& node, std::chrono::seconds now) const
|
||||
bool CConnman::ShouldRunInactivityChecks(const CNode& node, std::chrono::microseconds now) const
|
||||
{
|
||||
return node.m_connected + m_peer_connect_timeout < now;
|
||||
}
|
||||
|
||||
bool CConnman::InactivityCheck(const CNode& node) const
|
||||
bool CConnman::InactivityCheck(const CNode& node, std::chrono::microseconds now) const
|
||||
{
|
||||
// Tests that see disconnects after using mocktime can start nodes with a
|
||||
// large timeout. For example, -peertimeout=999999999.
|
||||
const auto now{GetTime<std::chrono::seconds>()};
|
||||
const auto last_send{node.m_last_send.load()};
|
||||
const auto last_recv{node.m_last_recv.load()};
|
||||
|
||||
@@ -2033,7 +2032,7 @@ bool CConnman::InactivityCheck(const CNode& node) const
|
||||
|
||||
if (now > last_send + TIMEOUT_INTERVAL) {
|
||||
LogDebug(BCLog::NET,
|
||||
"socket sending timeout: %is, %s\n", count_seconds(now - last_send),
|
||||
"socket sending timeout: %is, %s\n", Ticks<std::chrono::seconds>(now - last_send),
|
||||
node.DisconnectMsg(fLogIPs)
|
||||
);
|
||||
return true;
|
||||
@@ -2041,7 +2040,7 @@ bool CConnman::InactivityCheck(const CNode& node) const
|
||||
|
||||
if (now > last_recv + TIMEOUT_INTERVAL) {
|
||||
LogDebug(BCLog::NET,
|
||||
"socket receive timeout: %is, %s\n", count_seconds(now - last_recv),
|
||||
"socket receive timeout: %is, %s\n", Ticks<std::chrono::seconds>(now - last_recv),
|
||||
node.DisconnectMsg(fLogIPs)
|
||||
);
|
||||
return true;
|
||||
@@ -2123,6 +2122,8 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
|
||||
{
|
||||
AssertLockNotHeld(m_total_bytes_sent_mutex);
|
||||
|
||||
auto now = GetTime<std::chrono::microseconds>();
|
||||
|
||||
for (CNode* pnode : nodes) {
|
||||
if (m_interrupt_net->interrupted()) {
|
||||
return;
|
||||
@@ -2214,7 +2215,7 @@ void CConnman::SocketHandlerConnected(const std::vector<CNode*>& nodes,
|
||||
}
|
||||
}
|
||||
|
||||
if (InactivityCheck(*pnode)) pnode->fDisconnect = true;
|
||||
if (InactivityCheck(*pnode, now)) pnode->fDisconnect = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3900,7 +3901,7 @@ void CConnman::PushMessage(CNode* pnode, CSerializedNetMsg&& msg)
|
||||
AssertLockNotHeld(m_total_bytes_sent_mutex);
|
||||
size_t nMessageSize = msg.data.size();
|
||||
LogDebug(BCLog::NET, "sending %s (%d bytes) peer=%d\n", msg.m_type, nMessageSize, pnode->GetId());
|
||||
if (gArgs.GetBoolArg("-capturemessages", false)) {
|
||||
if (m_capture_messages) {
|
||||
CaptureMessage(pnode->addr, msg.m_type, msg.data, /*is_incoming=*/false);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user