diff options
author | John Newbery <john@johnnewbery.com> | 2020-12-19 10:27:24 +0000 |
---|---|---|
committer | John Newbery <john@johnnewbery.com> | 2020-12-20 10:06:14 +0000 |
commit | 3002b4af2b4fde63026f8f7c575452a5c989c662 (patch) | |
tree | c4e3cae21eacc9b19254ba361379c594efcb0000 | |
parent | 184557e8e03f76ff18dacdb32c12692d8578691f (diff) | |
download | bitcoin-3002b4af2b4fde63026f8f7c575452a5c989c662.tar.xz |
[net processing] Guard m_continuation_block with m_block_inv_mutex
-rw-r--r-- | src/net_processing.cpp | 26 | ||||
-rw-r--r-- | src/net_processing.h | 8 |
2 files changed, 18 insertions, 16 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 4b0bc2bcd2..4b9688d517 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1615,15 +1615,18 @@ void static ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChainParams& ch } } - // Trigger the peer node to send a getblocks request for the next batch of inventory - if (inv.hash == peer.m_continuation_block) { - // Send immediately. This must send even if redundant, - // and we want it right after the last block so they don't - // wait for other stuff first. - std::vector<CInv> vInv; - vInv.push_back(CInv(MSG_BLOCK, ::ChainActive().Tip()->GetBlockHash())); - connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::INV, vInv)); - peer.m_continuation_block.SetNull(); + { + LOCK(peer.m_block_inv_mutex); + // Trigger the peer node to send a getblocks request for the next batch of inventory + if (inv.hash == peer.m_continuation_block) { + // Send immediately. This must send even if redundant, + // and we want it right after the last block so they don't + // wait for other stuff first. + std::vector<CInv> vInv; + vInv.push_back(CInv(MSG_BLOCK, ::ChainActive().Tip()->GetBlockHash())); + connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::INV, vInv)); + peer.m_continuation_block.SetNull(); + } } } } @@ -2799,12 +2802,11 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat break; } WITH_LOCK(peer->m_block_inv_mutex, peer->m_blocks_for_inv_relay.push_back(pindex->GetBlockHash())); - if (--nLimit <= 0) - { + if (--nLimit <= 0) { // When this block is requested, we'll send an inv that'll // trigger the peer to getblocks the next batch of inventory. LogPrint(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString()); - peer->m_continuation_block = pindex->GetBlockHash(); + WITH_LOCK(peer->m_block_inv_mutex, {peer->m_continuation_block = pindex->GetBlockHash();}); break; } } diff --git a/src/net_processing.h b/src/net_processing.h index 32c5043a9d..f1f01f9139 100644 --- a/src/net_processing.h +++ b/src/net_processing.h @@ -73,14 +73,14 @@ struct Peer { * message. If we can't announce via a `headers` message, we'll fall back to * announcing via `inv`. */ std::vector<uint256> m_blocks_for_headers_relay GUARDED_BY(m_block_inv_mutex); - - /** This peer's reported block height when we connected */ - std::atomic<int> m_starting_height{-1}; /** The final block hash that we sent in an `inv` message to this peer. * When the peer requests this block, we send an `inv` message to trigger * the peer to request the next sequence of block hashes. * Most peers use headers-first syncing, which doesn't use this mechanism */ - uint256 m_continuation_block{}; + uint256 m_continuation_block GUARDED_BY(m_block_inv_mutex) {}; + + /** This peer's reported block height when we connected */ + std::atomic<int> m_starting_height{-1}; /** Set of txids to reconsider once their parent transactions have been accepted **/ std::set<uint256> m_orphan_work_set GUARDED_BY(g_cs_orphans); |