mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-05 14:06:27 -05:00
net_processing: move MarkBlockAs*, TipMayBeStale, FindNextBlocksToDL to PeerManagerImpl
Allows converting mapBlocksInFlight and g_last_tip_update from globals to member variables.
This commit is contained in:
parent
052d9bc7e5
commit
a490f0a056
1 changed files with 42 additions and 27 deletions
|
@ -169,6 +169,14 @@ void EraseOrphansFor(NodeId peer);
|
||||||
|
|
||||||
// Internal stuff
|
// Internal stuff
|
||||||
namespace {
|
namespace {
|
||||||
|
/** Blocks that are in flight, and that are in the queue to be downloaded. */
|
||||||
|
struct QueuedBlock {
|
||||||
|
uint256 hash;
|
||||||
|
const CBlockIndex* pindex; //!< Optional.
|
||||||
|
bool fValidatedHeaders; //!< Whether this block has validated headers at the time of request.
|
||||||
|
std::unique_ptr<PartiallyDownloadedBlock> partialBlock; //!< Optional, used for CMPCTBLOCK downloads
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data structure for an individual peer. This struct is not protected by
|
* Data structure for an individual peer. This struct is not protected by
|
||||||
* cs_main since it does not contain validation-critical data.
|
* cs_main since it does not contain validation-critical data.
|
||||||
|
@ -409,19 +417,33 @@ private:
|
||||||
*/
|
*/
|
||||||
Mutex m_recent_confirmed_transactions_mutex;
|
Mutex m_recent_confirmed_transactions_mutex;
|
||||||
std::unique_ptr<CRollingBloomFilter> m_recent_confirmed_transactions GUARDED_BY(m_recent_confirmed_transactions_mutex);
|
std::unique_ptr<CRollingBloomFilter> m_recent_confirmed_transactions GUARDED_BY(m_recent_confirmed_transactions_mutex);
|
||||||
|
|
||||||
|
/* Returns a bool indicating whether we requested this block.
|
||||||
|
* Also used if a block was /not/ received and timed out or started with another peer
|
||||||
|
*/
|
||||||
|
bool MarkBlockAsReceived(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
|
/* Mark a block as in flight
|
||||||
|
* 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 MarkBlockAsInFlight(CTxMemPool& mempool, NodeId nodeid, const uint256& hash, const CBlockIndex* pindex = nullptr, std::list<QueuedBlock>::iterator** pit = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
|
bool TipMayBeStale(const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
|
/** Update pindexLastCommonBlock and add not-in-flight missing successors to vBlocks, until it has
|
||||||
|
* at most count entries.
|
||||||
|
*/
|
||||||
|
void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<const CBlockIndex*>& vBlocks, NodeId& nodeStaller, const Consensus::Params& consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
|
|
||||||
|
std::map<uint256, std::pair<NodeId, std::list<QueuedBlock>::iterator> > mapBlocksInFlight GUARDED_BY(cs_main);
|
||||||
|
|
||||||
|
/** When our tip was last updated. */
|
||||||
|
std::atomic<int64_t> m_last_tip_update{0};
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/** Blocks that are in flight, and that are in the queue to be downloaded. */
|
|
||||||
struct QueuedBlock {
|
|
||||||
uint256 hash;
|
|
||||||
const CBlockIndex* pindex; //!< Optional.
|
|
||||||
bool fValidatedHeaders; //!< Whether this block has validated headers at the time of request.
|
|
||||||
std::unique_ptr<PartiallyDownloadedBlock> partialBlock; //!< Optional, used for CMPCTBLOCK downloads
|
|
||||||
};
|
|
||||||
std::map<uint256, std::pair<NodeId, std::list<QueuedBlock>::iterator> > mapBlocksInFlight GUARDED_BY(cs_main);
|
|
||||||
|
|
||||||
/** Stack of nodes which we have set to announce using compact blocks */
|
/** Stack of nodes which we have set to announce using compact blocks */
|
||||||
std::list<NodeId> lNodesAnnouncingHeaderAndIDs GUARDED_BY(cs_main);
|
std::list<NodeId> lNodesAnnouncingHeaderAndIDs GUARDED_BY(cs_main);
|
||||||
|
|
||||||
|
@ -431,9 +453,6 @@ namespace {
|
||||||
/** Number of peers from which we're downloading blocks. */
|
/** Number of peers from which we're downloading blocks. */
|
||||||
int nPeersWithValidatedDownloads GUARDED_BY(cs_main) = 0;
|
int nPeersWithValidatedDownloads GUARDED_BY(cs_main) = 0;
|
||||||
|
|
||||||
/** When our tip was last updated. */
|
|
||||||
std::atomic<int64_t> g_last_tip_update(0);
|
|
||||||
|
|
||||||
/** Relay map (txid or wtxid -> CTransactionRef) */
|
/** Relay map (txid or wtxid -> CTransactionRef) */
|
||||||
typedef std::map<uint256, CTransactionRef> MapRelay;
|
typedef std::map<uint256, CTransactionRef> MapRelay;
|
||||||
MapRelay mapRelay GUARDED_BY(cs_main);
|
MapRelay mapRelay GUARDED_BY(cs_main);
|
||||||
|
@ -612,9 +631,8 @@ static void UpdatePreferredDownload(const CNode& node, CNodeState* state) EXCLUS
|
||||||
nPreferredDownload += state->fPreferredDownload;
|
nPreferredDownload += state->fPreferredDownload;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns a bool indicating whether we requested this block.
|
bool PeerManagerImpl::MarkBlockAsReceived(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
// Also used if a block was /not/ received and timed out or started with another peer
|
{
|
||||||
static bool MarkBlockAsReceived(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) {
|
|
||||||
std::map<uint256, std::pair<NodeId, std::list<QueuedBlock>::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash);
|
std::map<uint256, std::pair<NodeId, std::list<QueuedBlock>::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash);
|
||||||
if (itInFlight != mapBlocksInFlight.end()) {
|
if (itInFlight != mapBlocksInFlight.end()) {
|
||||||
CNodeState *state = State(itInFlight->second.first);
|
CNodeState *state = State(itInFlight->second.first);
|
||||||
|
@ -637,9 +655,8 @@ static bool MarkBlockAsReceived(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns false, still setting pit, if the block was already in flight from the same peer
|
bool PeerManagerImpl::MarkBlockAsInFlight(CTxMemPool& mempool, NodeId nodeid, const uint256& hash, const CBlockIndex* pindex, std::list<QueuedBlock>::iterator** pit) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
// pit will only be valid as long as the same cs_main lock is being held
|
{
|
||||||
static bool MarkBlockAsInFlight(CTxMemPool& mempool, NodeId nodeid, const uint256& hash, const CBlockIndex* pindex = nullptr, std::list<QueuedBlock>::iterator** pit = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs_main) {
|
|
||||||
CNodeState *state = State(nodeid);
|
CNodeState *state = State(nodeid);
|
||||||
assert(state != nullptr);
|
assert(state != nullptr);
|
||||||
|
|
||||||
|
@ -752,13 +769,13 @@ static void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman& connma
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool TipMayBeStale(const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
bool PeerManagerImpl::TipMayBeStale(const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
if (g_last_tip_update == 0) {
|
if (m_last_tip_update == 0) {
|
||||||
g_last_tip_update = GetTime();
|
m_last_tip_update = GetTime();
|
||||||
}
|
}
|
||||||
return g_last_tip_update < GetTime() - consensusParams.nPowTargetSpacing * 3 && mapBlocksInFlight.empty();
|
return m_last_tip_update < GetTime() - consensusParams.nPowTargetSpacing * 3 && mapBlocksInFlight.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool CanDirectFetch(const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
static bool CanDirectFetch(const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
|
@ -775,9 +792,7 @@ static bool PeerHasHeader(CNodeState *state, const CBlockIndex *pindex) EXCLUSIV
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Update pindexLastCommonBlock and add not-in-flight missing successors to vBlocks, until it has
|
void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<const CBlockIndex*>& vBlocks, NodeId& nodeStaller, const Consensus::Params& consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
* at most count entries. */
|
|
||||||
static void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<const CBlockIndex*>& vBlocks, NodeId& nodeStaller, const Consensus::Params& consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
|
||||||
{
|
{
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -1396,7 +1411,7 @@ void PeerManagerImpl::BlockConnected(const std::shared_ptr<const CBlock>& pblock
|
||||||
LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased);
|
LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_last_tip_update = GetTime();
|
m_last_tip_update = GetTime();
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
LOCK(m_recent_confirmed_transactions_mutex);
|
LOCK(m_recent_confirmed_transactions_mutex);
|
||||||
|
@ -4251,7 +4266,7 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
|
||||||
// Check whether our tip is stale, and if so, allow using an extra
|
// Check whether our tip is stale, and if so, allow using an extra
|
||||||
// outbound peer
|
// outbound peer
|
||||||
if (!fImporting && !fReindex && m_connman.GetNetworkActive() && m_connman.GetUseAddrmanOutgoing() && TipMayBeStale(m_chainparams.GetConsensus())) {
|
if (!fImporting && !fReindex && m_connman.GetNetworkActive() && m_connman.GetUseAddrmanOutgoing() && TipMayBeStale(m_chainparams.GetConsensus())) {
|
||||||
LogPrintf("Potential stale tip detected, will try using extra outbound peer (last tip update: %d seconds ago)\n", time_in_seconds - g_last_tip_update);
|
LogPrintf("Potential stale tip detected, will try using extra outbound peer (last tip update: %d seconds ago)\n", time_in_seconds - m_last_tip_update);
|
||||||
m_connman.SetTryNewOutboundPeer(true);
|
m_connman.SetTryNewOutboundPeer(true);
|
||||||
} else if (m_connman.GetTryNewOutboundPeer()) {
|
} else if (m_connman.GetTryNewOutboundPeer()) {
|
||||||
m_connman.SetTryNewOutboundPeer(false);
|
m_connman.SetTryNewOutboundPeer(false);
|
||||||
|
|
Loading…
Add table
Reference in a new issue