partial bitcoin#23832: Changes time variables from int to chrono

includes:
- 6111b0d7fac89b7a0a03284ca6ec030ca7f30b99
This commit is contained in:
Kittywhiskers Van Gogh 2024-06-16 23:14:21 +00:00 committed by pasta
parent e803b320d6
commit 9399f90a13
No known key found for this signature in database
GPG Key ID: 52527BEDABE87984

View File

@ -101,8 +101,8 @@ static constexpr auto HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1ms;
* behind headers chain. * behind headers chain.
*/ */
static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4; static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;
/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */ /** Timeout for (unprotected) outbound peers to sync to our chainwork */
static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes static constexpr auto CHAIN_SYNC_TIMEOUT{20min};
/** How frequently to check for stale tips */ /** How frequently to check for stale tips */
static constexpr auto STALE_CHECK_INTERVAL{150s}; // 2.5 minutes (~block interval) static constexpr auto STALE_CHECK_INTERVAL{150s}; // 2.5 minutes (~block interval)
/** How frequently to check for extra outbound peers and disconnect */ /** How frequently to check for extra outbound peers and disconnect */
@ -421,7 +421,7 @@ private:
void ProcessPeerMsgRet(const PeerMsgRet& ret, CNode& pfrom) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void ProcessPeerMsgRet(const PeerMsgRet& ret, CNode& pfrom) EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
/** Consider evicting an outbound peer based on the amount of time they've been behind our tip */ /** Consider evicting an outbound peer based on the amount of time they've been behind our tip */
void ConsiderEviction(CNode& pto, int64_t time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main); void ConsiderEviction(CNode& pto, std::chrono::seconds time_in_seconds) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */ /** If we have extra outbound peers, try to disconnect the one with the oldest block announcement */
void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main); void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
@ -818,7 +818,7 @@ struct CNodeState {
*/ */
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
int64_t m_timeout{0}; std::chrono::seconds m_timeout{0s};
//! A header with the work we require on our peer's chain //! A header with the work we require on our peer's chain
const CBlockIndex* m_work_header{nullptr}; const CBlockIndex* m_work_header{nullptr};
//! After timeout is reached, set to true after sending getheaders //! After timeout is reached, set to true after sending getheaders
@ -1112,10 +1112,10 @@ bool PeerManagerImpl::TipMayBeStale()
{ {
AssertLockHeld(cs_main); AssertLockHeld(cs_main);
const Consensus::Params& consensusParams = m_chainparams.GetConsensus(); const Consensus::Params& consensusParams = m_chainparams.GetConsensus();
if (count_seconds(m_last_tip_update) == 0) { if (m_last_tip_update.load() == 0s) {
m_last_tip_update = GetTime<std::chrono::seconds>(); m_last_tip_update = GetTime<std::chrono::seconds>();
} }
return count_seconds(m_last_tip_update) < GetTime() - consensusParams.nPowTargetSpacing * 3 && mapBlocksInFlight.empty(); return m_last_tip_update.load() < GetTime<std::chrono::seconds>() - std::chrono::seconds{consensusParams.nPowTargetSpacing * 3} && mapBlocksInFlight.empty();
} }
bool PeerManagerImpl::CanDirectFetch() bool PeerManagerImpl::CanDirectFetch()
@ -5065,7 +5065,7 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
return fMoreWork; return fMoreWork;
} }
void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds) void PeerManagerImpl::ConsiderEviction(CNode& pto, std::chrono::seconds time_in_seconds)
{ {
AssertLockHeld(cs_main); AssertLockHeld(cs_main);
@ -5080,12 +5080,12 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
// unless it's invalid, in which case we should find that out and // unless it's invalid, in which case we should find that out and
// disconnect from them elsewhere). // disconnect from them elsewhere).
if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork) { if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork) {
if (state.m_chain_sync.m_timeout != 0) { if (state.m_chain_sync.m_timeout != 0s) {
state.m_chain_sync.m_timeout = 0; state.m_chain_sync.m_timeout = 0s;
state.m_chain_sync.m_work_header = nullptr; state.m_chain_sync.m_work_header = nullptr;
state.m_chain_sync.m_sent_getheaders = false; state.m_chain_sync.m_sent_getheaders = false;
} }
} else if (state.m_chain_sync.m_timeout == 0 || (state.m_chain_sync.m_work_header != nullptr && state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= state.m_chain_sync.m_work_header->nChainWork)) { } else if (state.m_chain_sync.m_timeout == 0s || (state.m_chain_sync.m_work_header != nullptr && state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= state.m_chain_sync.m_work_header->nChainWork)) {
// Our best block known by this peer is behind our tip, and we're either noticing // Our best block known by this peer is behind our tip, and we're either noticing
// that for the first time, OR this peer was able to catch up to some earlier point // that for the first time, OR this peer was able to catch up to some earlier point
// where we checked against our tip. // where we checked against our tip.
@ -5093,7 +5093,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
state.m_chain_sync.m_timeout = time_in_seconds + CHAIN_SYNC_TIMEOUT; state.m_chain_sync.m_timeout = time_in_seconds + CHAIN_SYNC_TIMEOUT;
state.m_chain_sync.m_work_header = m_chainman.ActiveChain().Tip(); state.m_chain_sync.m_work_header = m_chainman.ActiveChain().Tip();
state.m_chain_sync.m_sent_getheaders = false; state.m_chain_sync.m_sent_getheaders = false;
} else if (state.m_chain_sync.m_timeout > 0 && time_in_seconds > state.m_chain_sync.m_timeout) { } else if (state.m_chain_sync.m_timeout > 0s && time_in_seconds > state.m_chain_sync.m_timeout) {
// No evidence yet that our peer has synced to a chain with work equal to that // No evidence yet that our peer has synced to a chain with work equal to that
// of our tip, when we first detected it was behind. Send a single getheaders // of our tip, when we first detected it was behind. Send a single getheaders
// message to give the peer a chance to update us. // message to give the peer a chance to update us.
@ -5111,7 +5111,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
state.m_chain_sync.m_work_header->GetBlockHash().ToString()); state.m_chain_sync.m_work_header->GetBlockHash().ToString());
m_connman.PushMessage(&pto, msgMaker.Make(msg_type, m_chainman.ActiveChain().GetLocator(state.m_chain_sync.m_work_header->pprev), uint256())); m_connman.PushMessage(&pto, msgMaker.Make(msg_type, m_chainman.ActiveChain().GetLocator(state.m_chain_sync.m_work_header->pprev), uint256()));
state.m_chain_sync.m_sent_getheaders = true; state.m_chain_sync.m_sent_getheaders = true;
constexpr int64_t HEADERS_RESPONSE_TIME = 120; // 2 minutes constexpr auto HEADERS_RESPONSE_TIME{2min};
// Bump the timeout to allow a response, which could clear the timeout // Bump the timeout to allow a response, which could clear the timeout
// (if the response shows the peer has synced), reset the timeout (if // (if the response shows the peer has synced), reset the timeout (if
// the peer syncs to the required work but not to our tip), or result // the peer syncs to the required work but not to our tip), or result
@ -5243,7 +5243,8 @@ 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()) { if (!fImporting && !fReindex && m_connman.GetNetworkActive() && m_connman.GetUseAddrmanOutgoing() && TipMayBeStale()) {
LogPrintf("Potential stale tip detected, will try using extra outbound peer (last tip update: %d seconds ago)\n", count_seconds(now) - count_seconds(m_last_tip_update)); LogPrintf("Potential stale tip detected, will try using extra outbound peer (last tip update: %d seconds ago)\n",
count_seconds(now - m_last_tip_update.load()));
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);
@ -5861,7 +5862,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// Check that outbound peers have reasonable chains // Check that outbound peers have reasonable chains
// GetTime() is used by this anti-DoS logic so we can test this using mocktime // GetTime() is used by this anti-DoS logic so we can test this using mocktime
ConsiderEviction(*pto, GetTime()); ConsiderEviction(*pto, GetTime<std::chrono::seconds>());
// //
// Message: getdata (blocks) // Message: getdata (blocks)