diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 53d4638e2e..0231e43bae 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -910,7 +910,7 @@ private: * Returns false, still setting pit, if the block was already in flight from the same peer * pit will only be valid as long as the same cs_main lock is being held */ - bool BlockRequested(NodeId nodeid, const CBlockIndex* pindex, std::list::iterator** pit = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main); + bool BlockRequested(NodeId nodeid, const CBlockIndex& block, std::list::iterator** pit = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main); bool TipMayBeStale() EXCLUSIVE_LOCKS_REQUIRED(cs_main); @@ -1109,10 +1109,9 @@ void PeerManagerImpl::RemoveBlockRequest(const uint256& hash) mapBlocksInFlight.erase(it); } -bool PeerManagerImpl::BlockRequested(NodeId nodeid, const CBlockIndex *pindex, std::list::iterator **pit) +bool PeerManagerImpl::BlockRequested(NodeId nodeid, const CBlockIndex& block, std::list::iterator **pit) { - assert(pindex); - const uint256& hash{pindex->GetBlockHash()}; + const uint256& hash{block.GetBlockHash()}; CNodeState *state = State(nodeid); assert(state != nullptr); @@ -1130,7 +1129,7 @@ bool PeerManagerImpl::BlockRequested(NodeId nodeid, const CBlockIndex *pindex, s RemoveBlockRequest(hash); std::list::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(), - {pindex, std::unique_ptr(pit ? new PartiallyDownloadedBlock(&m_mempool) : nullptr)}); + {&block, std::unique_ptr(pit ? new PartiallyDownloadedBlock(&m_mempool) : nullptr)}); state->nBlocksInFlight++; if (state->nBlocksInFlight == 1) { // We're starting a block download (batch) from this peer. @@ -1138,8 +1137,9 @@ bool PeerManagerImpl::BlockRequested(NodeId nodeid, const CBlockIndex *pindex, s m_peers_downloading_from++; } itInFlight = mapBlocksInFlight.insert(std::make_pair(hash, std::make_pair(nodeid, it))).first; - if (pit) + if (pit) { *pit = &itInFlight->second.second; + } return true; } @@ -1822,7 +1822,7 @@ std::optional PeerManagerImpl::FetchBlock(NodeId peer_id, const CBl // Mark block as in-flight unless it already is (for this peer). // If a block was already in-flight for a different peer, its BLOCKTXN // response will be dropped. - if (!BlockRequested(peer_id, &block_index)) return "Already requested from this peer"; + if (!BlockRequested(peer_id, block_index)) return "Already requested from this peer"; // Construct message to request the block const uint256& hash{block_index.GetBlockHash()}; @@ -2812,7 +2812,7 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c break; } vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash())); - BlockRequested(pfrom.GetId(), pindex); + BlockRequested(pfrom.GetId(), *pindex); LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n", pindex->GetBlockHash().ToString(), pfrom.GetId()); } @@ -4353,7 +4353,7 @@ void PeerManagerImpl::ProcessMessage( if ((!fAlreadyInFlight && nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) || (fAlreadyInFlight && blockInFlightIt->second.first == pfrom.GetId())) { std::list::iterator *queuedBlockIt = nullptr; - if (!BlockRequested(pfrom.GetId(), pindex, &queuedBlockIt)) { + if (!BlockRequested(pfrom.GetId(), *pindex, &queuedBlockIt)) { if (!(*queuedBlockIt)->partialBlock) (*queuedBlockIt)->partialBlock.reset(new PartiallyDownloadedBlock(&m_mempool)); else { @@ -5910,7 +5910,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto) FindNextBlocksToDownload(*peer, MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller); for (const CBlockIndex *pindex : vToDownload) { vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash())); - BlockRequested(pto->GetId(), pindex); + BlockRequested(pto->GetId(), *pindex); LogPrint(BCLog::NET, "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(), pindex->nHeight, pto->GetId()); }