Skip to content

Commit d8c0d1c

Browse files
committed
[net processing] Move nUnconnectingHeaders from CNodeState to Peer
1 parent 5f80d8d commit d8c0d1c

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

src/net_processing.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,9 @@ struct Peer {
385385
/** Whether we've sent our peer a sendheaders message. **/
386386
std::atomic<bool> m_sent_sendheaders{false};
387387

388+
/** Length of current-streak of unconnecting headers announcements */
389+
int nUnconnectingHeaders GUARDED_BY(NetEventsInterface::g_msgproc_mutex){0};
390+
388391
explicit Peer(NodeId id, ServiceFlags our_services)
389392
: m_id{id}
390393
, m_our_services{our_services}
@@ -414,8 +417,6 @@ struct CNodeState {
414417
const CBlockIndex* pindexLastCommonBlock{nullptr};
415418
//! The best header we have sent our peer.
416419
const CBlockIndex* pindexBestHeaderSent{nullptr};
417-
//! Length of current-streak of unconnecting headers announcements
418-
int nUnconnectingHeaders GUARDED_BY(NetEventsInterface::g_msgproc_mutex){0};
419420
//! Whether we've started headers synchronization with this peer.
420421
bool fSyncStarted{false};
421422
//! When to potentially disconnect peer for stalling headers download
@@ -666,7 +667,7 @@ class PeerManagerImpl final : public PeerManager
666667
/** Potentially fetch blocks from this peer upon receipt of a new headers tip */
667668
void HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, const CBlockIndex& last_header);
668669
/** Update peer state based on received headers message */
669-
void UpdatePeerStateForReceivedHeaders(CNode& pfrom, const CBlockIndex& last_header, bool received_new_header, bool may_have_more_headers)
670+
void UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer, const CBlockIndex& last_header, bool received_new_header, bool may_have_more_headers)
670671
EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
671672

672673
void SendBlockTransactions(CNode& pfrom, Peer& peer, const CBlock& block, const BlockTransactionsRequest& req);
@@ -2440,27 +2441,26 @@ arith_uint256 PeerManagerImpl::GetAntiDoSWorkThreshold()
24402441
void PeerManagerImpl::HandleFewUnconnectingHeaders(CNode& pfrom, Peer& peer,
24412442
const std::vector<CBlockHeader>& headers)
24422443
{
2443-
LOCK(cs_main);
2444-
CNodeState *nodestate = State(pfrom.GetId());
2445-
2446-
nodestate->nUnconnectingHeaders++;
2444+
peer.nUnconnectingHeaders++;
24472445
// Try to fill in the missing headers.
2448-
if (MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), peer)) {
2446+
const CBlockIndex* best_header{WITH_LOCK(cs_main, return m_chainman.m_best_header)};
2447+
if (MaybeSendGetHeaders(pfrom, GetLocator(best_header), peer)) {
24492448
LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",
24502449
headers[0].GetHash().ToString(),
24512450
headers[0].hashPrevBlock.ToString(),
2452-
m_chainman.m_best_header->nHeight,
2453-
pfrom.GetId(), nodestate->nUnconnectingHeaders);
2451+
best_header->nHeight,
2452+
pfrom.GetId(), peer.nUnconnectingHeaders);
24542453
}
2454+
24552455
// Set hashLastUnknownBlock for this peer, so that if we
24562456
// eventually get the headers - even from a different peer -
24572457
// we can use this peer to download.
2458-
UpdateBlockAvailability(pfrom.GetId(), headers.back().GetHash());
2458+
WITH_LOCK(cs_main, UpdateBlockAvailability(pfrom.GetId(), headers.back().GetHash()));
24592459

24602460
// The peer may just be broken, so periodically assign DoS points if this
24612461
// condition persists.
2462-
if (nodestate->nUnconnectingHeaders % MAX_UNCONNECTING_HEADERS == 0) {
2463-
Misbehaving(peer, 20, strprintf("%d non-connecting headers", nodestate->nUnconnectingHeaders));
2462+
if (peer.nUnconnectingHeaders % MAX_UNCONNECTING_HEADERS == 0) {
2463+
Misbehaving(peer, 20, strprintf("%d non-connecting headers", peer.nUnconnectingHeaders));
24642464
}
24652465
}
24662466

@@ -2708,15 +2708,16 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
27082708
* whether that header was new and whether the headers message was full,
27092709
* update the state we keep for the peer.
27102710
*/
2711-
void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom,
2711+
void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer,
27122712
const CBlockIndex& last_header, bool received_new_header, bool may_have_more_headers)
27132713
{
2714+
if (peer.nUnconnectingHeaders > 0) {
2715+
LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom.GetId(), peer.nUnconnectingHeaders);
2716+
}
2717+
peer.nUnconnectingHeaders = 0;
2718+
27142719
LOCK(cs_main);
27152720
CNodeState *nodestate = State(pfrom.GetId());
2716-
if (nodestate->nUnconnectingHeaders > 0) {
2717-
LogPrint(BCLog::NET, "peer=%d: resetting nUnconnectingHeaders (%d -> 0)\n", pfrom.GetId(), nodestate->nUnconnectingHeaders);
2718-
}
2719-
nodestate->nUnconnectingHeaders = 0;
27202721

27212722
UpdateBlockAvailability(pfrom.GetId(), last_header.GetBlockHash());
27222723

@@ -2901,7 +2902,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
29012902
}
29022903
}
29032904

2904-
UpdatePeerStateForReceivedHeaders(pfrom, *pindexLast, received_new_header, nCount == MAX_HEADERS_RESULTS);
2905+
UpdatePeerStateForReceivedHeaders(pfrom, peer, *pindexLast, received_new_header, nCount == MAX_HEADERS_RESULTS);
29052906

29062907
// Consider immediately downloading blocks.
29072908
HeadersDirectFetchBlocks(pfrom, peer, *pindexLast);

0 commit comments

Comments
 (0)