mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-17 21:32:00 +01:00
Merge 93b07997e9a38523f5ab850aa32ca57983fd2552 into 5f4422d68dc3530c353af1f87499de1c864b60ad
This commit is contained in:
commit
0e5df3bdda
@ -5781,7 +5781,9 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
|
|
||||||
// Detect whether we're stalling
|
// Detect whether we're stalling
|
||||||
auto stalling_timeout = m_block_stalling_timeout.load();
|
auto stalling_timeout = m_block_stalling_timeout.load();
|
||||||
if (state.m_stalling_since.count() && state.m_stalling_since < current_time - stalling_timeout) {
|
// Allow more time for addnode peers
|
||||||
|
const auto adjusted_timeout{pto->IsManualConn() ? BLOCK_STALLING_TIMEOUT_MAX : stalling_timeout};
|
||||||
|
if (state.m_stalling_since.count() && state.m_stalling_since < current_time - adjusted_timeout) {
|
||||||
// Stalling only triggers when the block download window cannot move. During normal steady state,
|
// Stalling only triggers when the block download window cannot move. During normal steady state,
|
||||||
// the download window should be much larger than the to-be-downloaded set of blocks, so disconnection
|
// the download window should be much larger than the to-be-downloaded set of blocks, so disconnection
|
||||||
// should only happen during initial block download.
|
// should only happen during initial block download.
|
||||||
@ -5796,7 +5798,8 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// In case there is a block that has been in flight from this peer for block_interval * (1 + 0.5 * N)
|
// In case there is a block that has been in flight from this peer for block_interval * (1 + 0.5 * N)
|
||||||
// (with N the number of peers from which we're downloading validated blocks), disconnect due to timeout.
|
// (with N the number of peers from which we're downloading validated blocks), disconnect due to timeout
|
||||||
|
// unless it is an addnode peer.
|
||||||
// We compensate for other peers to prevent killing off peers due to our own downstream link
|
// We compensate for other peers to prevent killing off peers due to our own downstream link
|
||||||
// being saturated. We only count validated in-flight blocks so peers can't advertise non-existing block hashes
|
// being saturated. We only count validated in-flight blocks so peers can't advertise non-existing block hashes
|
||||||
// to unreasonably increase our timeout.
|
// to unreasonably increase our timeout.
|
||||||
@ -5804,8 +5807,12 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
QueuedBlock &queuedBlock = state.vBlocksInFlight.front();
|
QueuedBlock &queuedBlock = state.vBlocksInFlight.front();
|
||||||
int nOtherPeersWithValidatedDownloads = m_peers_downloading_from - 1;
|
int nOtherPeersWithValidatedDownloads = m_peers_downloading_from - 1;
|
||||||
if (current_time > state.m_downloading_since + std::chrono::seconds{consensusParams.nPowTargetSpacing} * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
if (current_time > state.m_downloading_since + std::chrono::seconds{consensusParams.nPowTargetSpacing} * (BLOCK_DOWNLOAD_TIMEOUT_BASE + BLOCK_DOWNLOAD_TIMEOUT_PER_PEER * nOtherPeersWithValidatedDownloads)) {
|
||||||
LogInfo("Timeout downloading block %s, %s\n", queuedBlock.pindex->GetBlockHash().ToString(), pto->DisconnectMsg(fLogIPs));
|
if (pto->IsManualConn()) {
|
||||||
pto->fDisconnect = true;
|
LogInfo("Timeout downloading block %s from addnode peer, not %s\n", queuedBlock.pindex->GetBlockHash().ToString(), pto->DisconnectMsg(fLogIPs));
|
||||||
|
} else {
|
||||||
|
LogInfo("Timeout downloading block %s, %s\n", queuedBlock.pindex->GetBlockHash().ToString(), pto->DisconnectMsg(fLogIPs));
|
||||||
|
pto->fDisconnect = true;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5814,17 +5821,18 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||||||
// Detect whether this is a stalling initial-headers-sync peer
|
// Detect whether this is a stalling initial-headers-sync peer
|
||||||
if (m_chainman.m_best_header->Time() <= NodeClock::now() - 24h) {
|
if (m_chainman.m_best_header->Time() <= NodeClock::now() - 24h) {
|
||||||
if (current_time > peer->m_headers_sync_timeout && nSyncStarted == 1 && (m_num_preferred_download_peers - state.fPreferredDownload >= 1)) {
|
if (current_time > peer->m_headers_sync_timeout && nSyncStarted == 1 && (m_num_preferred_download_peers - state.fPreferredDownload >= 1)) {
|
||||||
// Disconnect a peer (without NetPermissionFlags::NoBan permission) if it is our only sync peer,
|
// Disconnect a peer (if it is neither an addnode peer, nor has
|
||||||
|
// NetPermissionFlags::NoBan permission) if it is our only sync peer
|
||||||
// and we have others we could be using instead.
|
// and we have others we could be using instead.
|
||||||
// Note: If all our peers are inbound, then we won't
|
// Note: If all our peers are inbound, then we won't
|
||||||
// disconnect our sync peer for stalling; we have bigger
|
// disconnect our sync peer for stalling; we have bigger
|
||||||
// problems if we can't get any outbound peers.
|
// problems if we can't get any outbound peers.
|
||||||
if (!pto->HasPermission(NetPermissionFlags::NoBan)) {
|
if (!pto->IsManualConn() && !pto->HasPermission(NetPermissionFlags::NoBan)) {
|
||||||
LogInfo("Timeout downloading headers, %s\n", pto->DisconnectMsg(fLogIPs));
|
LogInfo("Timeout downloading headers, %s\n", pto->DisconnectMsg(fLogIPs));
|
||||||
pto->fDisconnect = true;
|
pto->fDisconnect = true;
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
LogInfo("Timeout downloading headers from noban peer, not %s\n", pto->DisconnectMsg(fLogIPs));
|
LogInfo("Timeout downloading headers from %s peer, not %s\n", pto->IsManualConn() ? "addnode" : "noban", pto->DisconnectMsg(fLogIPs));
|
||||||
// Reset the headers sync state so that we have a
|
// Reset the headers sync state so that we have a
|
||||||
// chance to try downloading from a different peer.
|
// chance to try downloading from a different peer.
|
||||||
// Note: this will also result in at least one more
|
// Note: this will also result in at least one more
|
||||||
|
@ -307,7 +307,8 @@ static RPCHelpMan addnode()
|
|||||||
return RPCHelpMan{"addnode",
|
return RPCHelpMan{"addnode",
|
||||||
"\nAttempts to add or remove a node from the addnode list.\n"
|
"\nAttempts to add or remove a node from the addnode list.\n"
|
||||||
"Or try a connection to a node once.\n"
|
"Or try a connection to a node once.\n"
|
||||||
"Nodes added using addnode (or -connect) are protected from DoS disconnection and are not required to be\n"
|
"Nodes added using addnode (or -connect) are protected from disconnection due to DoS or IBD header/block\n"
|
||||||
|
"download timeouts (and given more time before considered to be stalling), and are not required to be\n"
|
||||||
"full nodes/support SegWit as other outbound peers are (though such peers will not be synced from).\n" +
|
"full nodes/support SegWit as other outbound peers are (though such peers will not be synced from).\n" +
|
||||||
strprintf("Addnode connections are limited to %u at a time", MAX_ADDNODE_CONNECTIONS) +
|
strprintf("Addnode connections are limited to %u at a time", MAX_ADDNODE_CONNECTIONS) +
|
||||||
" and are counted separately from the -maxconnections limit.\n",
|
" and are counted separately from the -maxconnections limit.\n",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user