mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Merge #19871: doc: Clarify scope of eviction protection of outbound block-relay peers
d76925478efd35e6fd835370639f2139b28381e4 [doc] Clarify semantic of peer's m_protect w.r.t to outbound eviction logics (Antoine Riard) ac71fe936da290adf5a3155fe8db5f78b485f1f1 [doc] Clarify scope of eviction protection of outbound block-relay peers (Antoine Riard) Pull request description: Block-relay-only peers were introduced by #15759. According to its author, it was intented to make them only immune to outbound peer rotation-based eviction and not from all eviction as modified comment leans to think of. Clearly indicate that outbound block-relay peers aren't protected from eviction by the bad/lagging chain logic. Fix #19863 ACKs for top commit: naumenkogs: ACK d76925478efd35e6fd835370639f2139b28381e4 jonatack: ACK d76925478efd35e6fd835370639f2139b28381e4 Tree-SHA512: 597fbd62838a6e39276024165b11514cad20a2e9d33cf9202d261cbadcb62b2df427c858e0cb57e585840d4c1d4600104aa53916bb868541f2580e4eed9b4b52
This commit is contained in:
parent
4f3a1effbf
commit
7caec1df14
@ -563,10 +563,17 @@ struct CNodeState {
|
|||||||
*/
|
*/
|
||||||
bool fSupportsDesiredCmpctVersion;
|
bool fSupportsDesiredCmpctVersion;
|
||||||
|
|
||||||
/** State used to enforce CHAIN_SYNC_TIMEOUT
|
/** State used to enforce CHAIN_SYNC_TIMEOUT and EXTRA_PEER_CHECK_INTERVAL logic.
|
||||||
* Only in effect for outbound, non-manual, full-relay connections, with
|
*
|
||||||
* m_protect == false
|
* Both are only in effect for outbound, non-manual, non-protected connections.
|
||||||
* Algorithm: if a peer's best known block has less work than our tip,
|
* Any peer protected (m_protect = true) is not chosen for eviction. A peer is
|
||||||
|
* marked as protected if all of these are true:
|
||||||
|
* - its connection type is IsBlockOnlyConn() == false
|
||||||
|
* - it gave us a valid connecting header
|
||||||
|
* - we haven't reached MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT yet
|
||||||
|
* - it has a better chain than we have
|
||||||
|
*
|
||||||
|
* CHAIN_SYNC_TIMEOUT: if a peer's best known block has less work than our tip,
|
||||||
* set a timeout CHAIN_SYNC_TIMEOUT seconds in the future:
|
* set a timeout CHAIN_SYNC_TIMEOUT seconds in the future:
|
||||||
* - If at timeout their best known block now has more work than our tip
|
* - If at timeout their best known block now has more work than our tip
|
||||||
* when the timeout was set, then either reset the timeout or clear it
|
* when the timeout was set, then either reset the timeout or clear it
|
||||||
@ -576,6 +583,9 @@ struct CNodeState {
|
|||||||
* and set a shorter timeout, HEADERS_RESPONSE_TIME seconds in future.
|
* and set a shorter timeout, HEADERS_RESPONSE_TIME seconds in future.
|
||||||
* If their best known block is still behind when that new timeout is
|
* If their best known block is still behind when that new timeout is
|
||||||
* reached, disconnect.
|
* reached, disconnect.
|
||||||
|
*
|
||||||
|
* EXTRA_PEER_CHECK_INTERVAL: after each interval, if we have too many outbound peers,
|
||||||
|
* drop the outbound one that least recently announced us a new block.
|
||||||
*/
|
*/
|
||||||
struct ChainSyncTimeoutState {
|
struct ChainSyncTimeoutState {
|
||||||
//! A timeout used for checking whether our peer has sufficiently synced
|
//! A timeout used for checking whether our peer has sufficiently synced
|
||||||
@ -2466,12 +2476,12 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const std::vector<CBlo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pfrom.fDisconnect && IsOutboundDisconnectionCandidate(pfrom) && nodestate->pindexBestKnownBlock != nullptr && pfrom.IsAddrRelayPeer()) {
|
|
||||||
// If this is an outbound full-relay peer, check to see if we should protect
|
// If this is an outbound full-relay peer, check to see if we should protect
|
||||||
// it from the bad/lagging chain logic.
|
// it from the bad/lagging chain logic.
|
||||||
// Note that block-relay-only peers are already implicitly protected, so we
|
// Note that outbound block-relay peers are excluded from this protection, and
|
||||||
// only consider setting m_protect for the full-relay peers.
|
// thus always subject to eviction under the bad/lagging chain logic.
|
||||||
|
// See ChainSyncTimeoutState.
|
||||||
|
if (!pfrom.fDisconnect && IsOutboundDisconnectionCandidate(pfrom) && nodestate->pindexBestKnownBlock != nullptr && pfrom.IsAddrRelayPeer()) {
|
||||||
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
|
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
|
||||||
LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
|
LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
|
||||||
nodestate->m_chain_sync.m_protect = true;
|
nodestate->m_chain_sync.m_protect = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user