mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 06:52:36 +01:00
Merge bitcoin/bitcoin#23832: Refactor: Changes time variables from int to chrono
fe86eb50c9
Refactor: Uses c++ init convention for time variables (Shashwat)6111b0d7fa
Refactor: Changes remaining time variable type from int to chrono (Shashwat) Pull request description: This PR is a follow-up to #23801. This PR aims to make the following changes to all the time variables in **net_processing.cpp** wherever possible. - Convert all time variables to `std::chrono.` - Use `chorno::literals` wherever possible. - Use `auto` keywords wherever possible. - Use `var{val}` convention of initialization. This PR also minimizes the number of times, serialization of time `count_seconds(..)` occurs. ACKs for top commit: MarcoFalke: re-ACKfe86eb50c9
🏕 Tree-SHA512: c8684c0c60a11140027e36b6e9706a45ecdeae6b5ba0bf267e50655835daee5e5410e34096a8c4eca005f327caae1ac258cc7b8ba663eab58abf131f6d2f4d42
This commit is contained in:
commit
06209574da
1 changed files with 40 additions and 40 deletions
|
@ -57,14 +57,14 @@ static constexpr auto HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1ms;
|
|||
* behind headers chain.
|
||||
*/
|
||||
static constexpr int32_t MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4;
|
||||
/** Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds */
|
||||
static constexpr int64_t CHAIN_SYNC_TIMEOUT = 20 * 60; // 20 minutes
|
||||
/** Timeout for (unprotected) outbound peers to sync to our chainwork */
|
||||
static constexpr auto CHAIN_SYNC_TIMEOUT{20min};
|
||||
/** How frequently to check for stale tips */
|
||||
static constexpr auto STALE_CHECK_INTERVAL{10min};
|
||||
/** How frequently to check for extra outbound peers and disconnect */
|
||||
static constexpr auto EXTRA_PEER_CHECK_INTERVAL{45s};
|
||||
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict */
|
||||
static constexpr std::chrono::seconds MINIMUM_CONNECT_TIME{30};
|
||||
static constexpr auto MINIMUM_CONNECT_TIME{30s};
|
||||
/** SHA256("main address relay")[0:8] */
|
||||
static constexpr uint64_t RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL;
|
||||
/// Age after which a stale block will no longer be served if requested as
|
||||
|
@ -74,7 +74,7 @@ static constexpr int STALE_RELAY_AGE_LIMIT = 30 * 24 * 60 * 60;
|
|||
/// limiting block relay. Set to one week, denominated in seconds.
|
||||
static constexpr int HISTORICAL_BLOCK_AGE = 7 * 24 * 60 * 60;
|
||||
/** Time between pings automatically sent out for latency probing and keepalive */
|
||||
static constexpr std::chrono::minutes PING_INTERVAL{2};
|
||||
static constexpr auto PING_INTERVAL{2min};
|
||||
/** The maximum number of entries in a locator */
|
||||
static const unsigned int MAX_LOCATOR_SZ = 101;
|
||||
/** The maximum number of entries in an 'inv' protocol message */
|
||||
|
@ -88,19 +88,19 @@ static constexpr int32_t MAX_PEER_TX_REQUEST_IN_FLIGHT = 100;
|
|||
* the actual transaction (from any peer) in response to requests for them. */
|
||||
static constexpr int32_t MAX_PEER_TX_ANNOUNCEMENTS = 5000;
|
||||
/** How long to delay requesting transactions via txids, if we have wtxid-relaying peers */
|
||||
static constexpr auto TXID_RELAY_DELAY = std::chrono::seconds{2};
|
||||
static constexpr auto TXID_RELAY_DELAY{2s};
|
||||
/** How long to delay requesting transactions from non-preferred peers */
|
||||
static constexpr auto NONPREF_PEER_TX_DELAY = std::chrono::seconds{2};
|
||||
static constexpr auto NONPREF_PEER_TX_DELAY{2s};
|
||||
/** How long to delay requesting transactions from overloaded peers (see MAX_PEER_TX_REQUEST_IN_FLIGHT). */
|
||||
static constexpr auto OVERLOADED_PEER_TX_DELAY = std::chrono::seconds{2};
|
||||
/** How long to wait (in microseconds) before downloading a transaction from an additional peer */
|
||||
static constexpr std::chrono::microseconds GETDATA_TX_INTERVAL{std::chrono::seconds{60}};
|
||||
static constexpr auto OVERLOADED_PEER_TX_DELAY{2s};
|
||||
/** How long to wait before downloading a transaction from an additional peer */
|
||||
static constexpr auto GETDATA_TX_INTERVAL{60s};
|
||||
/** Limit to avoid sending big packets. Not used in processing incoming GETDATA for compatibility */
|
||||
static const unsigned int MAX_GETDATA_SZ = 1000;
|
||||
/** Number of blocks that can be requested at any given time from a single peer. */
|
||||
static const int MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16;
|
||||
/** Time during which a peer must stall block download progress before being disconnected. */
|
||||
static constexpr auto BLOCK_STALLING_TIMEOUT = 2s;
|
||||
static constexpr auto BLOCK_STALLING_TIMEOUT{2s};
|
||||
/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
|
||||
* less than this number, we reached its tip. Changing this value is a protocol upgrade. */
|
||||
static const unsigned int MAX_HEADERS_RESULTS = 2000;
|
||||
|
@ -125,16 +125,16 @@ static const int MAX_UNCONNECTING_HEADERS = 10;
|
|||
/** Minimum blocks required to signal NODE_NETWORK_LIMITED */
|
||||
static const unsigned int NODE_NETWORK_LIMITED_MIN_BLOCKS = 288;
|
||||
/** Average delay between local address broadcasts */
|
||||
static constexpr auto AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL = 24h;
|
||||
static constexpr auto AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL{24h};
|
||||
/** Average delay between peer address broadcasts */
|
||||
static constexpr auto AVG_ADDRESS_BROADCAST_INTERVAL = 30s;
|
||||
static constexpr auto AVG_ADDRESS_BROADCAST_INTERVAL{30s};
|
||||
/** Average delay between trickled inventory transmissions for inbound peers.
|
||||
* Blocks and peers with NetPermissionFlags::NoBan permission bypass this. */
|
||||
static constexpr auto INBOUND_INVENTORY_BROADCAST_INTERVAL = 5s;
|
||||
static constexpr auto INBOUND_INVENTORY_BROADCAST_INTERVAL{5s};
|
||||
/** Average delay between trickled inventory transmissions for outbound peers.
|
||||
* Use a smaller delay as there is less privacy concern for them.
|
||||
* Blocks and peers with NetPermissionFlags::NoBan permission bypass this. */
|
||||
static constexpr auto OUTBOUND_INVENTORY_BROADCAST_INTERVAL = 2s;
|
||||
static constexpr auto OUTBOUND_INVENTORY_BROADCAST_INTERVAL{2s};
|
||||
/** Maximum rate of inventory items to send per second.
|
||||
* Limits the impact of low-fee transaction floods. */
|
||||
static constexpr unsigned int INVENTORY_BROADCAST_PER_SECOND = 7;
|
||||
|
@ -148,9 +148,9 @@ static constexpr unsigned int INVENTORY_MAX_RECENT_RELAY = 3500;
|
|||
* peers, and random variations in the broadcast mechanism. */
|
||||
static_assert(INVENTORY_MAX_RECENT_RELAY >= INVENTORY_BROADCAST_PER_SECOND * UNCONDITIONAL_RELAY_DELAY / std::chrono::seconds{1}, "INVENTORY_RELAY_MAX too low");
|
||||
/** Average delay between feefilter broadcasts in seconds. */
|
||||
static constexpr auto AVG_FEEFILTER_BROADCAST_INTERVAL = 10min;
|
||||
static constexpr auto AVG_FEEFILTER_BROADCAST_INTERVAL{10min};
|
||||
/** Maximum feefilter broadcast delay after significant change. */
|
||||
static constexpr auto MAX_FEEFILTER_CHANGE_DELAY = 5min;
|
||||
static constexpr auto MAX_FEEFILTER_CHANGE_DELAY{5min};
|
||||
/** Maximum number of compact filters that may be requested with one getcfilters. See BIP 157. */
|
||||
static constexpr uint32_t MAX_GETCFILTERS_SIZE = 1000;
|
||||
/** Maximum number of cf hashes that may be requested with one getcfheaders. See BIP 157. */
|
||||
|
@ -329,7 +329,7 @@ private:
|
|||
EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||
|
||||
/** 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 */
|
||||
void EvictExtraOutboundPeers(std::chrono::seconds now) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||
|
@ -727,7 +727,7 @@ struct CNodeState {
|
|||
* - its chain tip has at least as much work as ours
|
||||
*
|
||||
* CHAIN_SYNC_TIMEOUT: if a peer's best known block has less work than our tip,
|
||||
* set a timeout CHAIN_SYNC_TIMEOUT seconds in the future:
|
||||
* set a timeout CHAIN_SYNC_TIMEOUT in the future:
|
||||
* - If at timeout their best known block now has more work than our tip
|
||||
* when the timeout was set, then either reset the timeout or clear it
|
||||
* (after comparing against our current tip's work)
|
||||
|
@ -742,7 +742,7 @@ struct CNodeState {
|
|||
*/
|
||||
struct ChainSyncTimeoutState {
|
||||
//! 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
|
||||
const CBlockIndex* m_work_header{nullptr};
|
||||
//! After timeout is reached, set to true after sending getheaders
|
||||
|
@ -949,10 +949,10 @@ bool PeerManagerImpl::TipMayBeStale()
|
|||
{
|
||||
AssertLockHeld(cs_main);
|
||||
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>();
|
||||
}
|
||||
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()
|
||||
|
@ -1137,7 +1137,7 @@ void PeerManagerImpl::AddTxAnnouncement(const CNode& node, const GenTxid& gtxid,
|
|||
// - TXID_RELAY_DELAY for txid announcements while wtxid peers are available
|
||||
// - OVERLOADED_PEER_TX_DELAY for announcements from peers which have at least
|
||||
// MAX_PEER_TX_REQUEST_IN_FLIGHT requests in flight (and don't have NetPermissionFlags::Relay).
|
||||
auto delay = std::chrono::microseconds{0};
|
||||
auto delay{0us};
|
||||
const bool preferred = state->fPreferredDownload;
|
||||
if (!preferred) delay += NONPREF_PEER_TX_DELAY;
|
||||
if (!gtxid.IsWtxid() && m_wtxid_relay_peers > 0) delay += TXID_RELAY_DELAY;
|
||||
|
@ -1191,7 +1191,7 @@ void PeerManagerImpl::ReattemptInitialBroadcast(CScheduler& scheduler)
|
|||
|
||||
// Schedule next run for 10-15 minutes in the future.
|
||||
// We add randomness on every cycle to avoid the possibility of P2P fingerprinting.
|
||||
const std::chrono::milliseconds delta = std::chrono::minutes{10} + GetRandMillis(std::chrono::minutes{5});
|
||||
const std::chrono::milliseconds delta = 10min + GetRandMillis(5min);
|
||||
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
|
||||
}
|
||||
|
||||
|
@ -1296,7 +1296,7 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
|
|||
// since pingtime does not update until the ping is complete, which might take a while.
|
||||
// So, if a ping is taking an unusually long time in flight,
|
||||
// the caller can immediately detect that this is happening.
|
||||
std::chrono::microseconds ping_wait{0};
|
||||
auto ping_wait{0us};
|
||||
if ((0 != peer->m_ping_nonce_sent) && (0 != peer->m_ping_start.load().count())) {
|
||||
ping_wait = GetTime<std::chrono::microseconds>() - peer->m_ping_start.load();
|
||||
}
|
||||
|
@ -1496,7 +1496,7 @@ void PeerManagerImpl::StartScheduledTasks(CScheduler& scheduler)
|
|||
scheduler.scheduleEvery([this] { this->CheckForStaleTipAndEvictPeers(); }, std::chrono::seconds{EXTRA_PEER_CHECK_INTERVAL});
|
||||
|
||||
// schedule next run for 10-15 minutes in the future
|
||||
const std::chrono::milliseconds delta = std::chrono::minutes{10} + GetRandMillis(std::chrono::minutes{5});
|
||||
const std::chrono::milliseconds delta = 10min + GetRandMillis(5min);
|
||||
scheduler.scheduleFromNow([&] { ReattemptInitialBroadcast(scheduler); }, delta);
|
||||
}
|
||||
|
||||
|
@ -1963,10 +1963,9 @@ void PeerManagerImpl::ProcessGetData(CNode& pfrom, Peer& peer, const std::atomic
|
|||
std::vector<CInv> vNotFound;
|
||||
const CNetMsgMaker msgMaker(pfrom.GetCommonVersion());
|
||||
|
||||
const std::chrono::seconds now = GetTime<std::chrono::seconds>();
|
||||
const auto now{GetTime<std::chrono::seconds>()};
|
||||
// Get last mempool request time
|
||||
const std::chrono::seconds mempool_req = pfrom.m_tx_relay != nullptr ? pfrom.m_tx_relay->m_last_mempool_req.load()
|
||||
: std::chrono::seconds::min();
|
||||
const auto mempool_req = pfrom.m_tx_relay != nullptr ? pfrom.m_tx_relay->m_last_mempool_req.load() : std::chrono::seconds::min();
|
||||
|
||||
// Process as many TX items from the front of the getdata queue as
|
||||
// possible, since they're common and it's efficient to batch process
|
||||
|
@ -2890,7 +2889,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
|||
int64_t nSince = nNow - 10 * 60;
|
||||
|
||||
// Update/increment addr rate limiting bucket.
|
||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||
const auto current_time{GetTime<std::chrono::microseconds>()};
|
||||
if (peer->m_addr_token_bucket < MAX_ADDR_PROCESSING_TOKEN_BUCKET) {
|
||||
// Don't increment bucket if it's already full
|
||||
const auto time_diff = std::max(current_time - peer->m_addr_token_timestamp, 0us);
|
||||
|
@ -2976,7 +2975,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
|||
|
||||
LOCK(cs_main);
|
||||
|
||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||
const auto current_time{GetTime<std::chrono::microseconds>()};
|
||||
uint256* best_block{nullptr};
|
||||
|
||||
for (CInv& inv : vInv) {
|
||||
|
@ -3354,7 +3353,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
|||
}
|
||||
}
|
||||
if (!fRejectedParents) {
|
||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||
const auto current_time{GetTime<std::chrono::microseconds>()};
|
||||
|
||||
for (const uint256& parent_txid : unique_parents) {
|
||||
// Here, we only have the txid (and not wtxid) of the
|
||||
|
@ -4180,7 +4179,7 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
|
|||
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);
|
||||
|
||||
|
@ -4195,12 +4194,12 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
|||
// unless it's invalid, in which case we should find that out and
|
||||
// disconnect from them elsewhere).
|
||||
if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork) {
|
||||
if (state.m_chain_sync.m_timeout != 0) {
|
||||
state.m_chain_sync.m_timeout = 0;
|
||||
if (state.m_chain_sync.m_timeout != 0s) {
|
||||
state.m_chain_sync.m_timeout = 0s;
|
||||
state.m_chain_sync.m_work_header = nullptr;
|
||||
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
|
||||
// that for the first time, OR this peer was able to catch up to some earlier point
|
||||
// where we checked against our tip.
|
||||
|
@ -4208,7 +4207,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_work_header = m_chainman.ActiveChain().Tip();
|
||||
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
|
||||
// of our tip, when we first detected it was behind. Send a single getheaders
|
||||
// message to give the peer a chance to update us.
|
||||
|
@ -4221,7 +4220,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
|||
LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
|
||||
m_connman.PushMessage(&pto, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(state.m_chain_sync.m_work_header->pprev), uint256()));
|
||||
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
|
||||
// (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
|
||||
|
@ -4348,7 +4347,8 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
|
|||
// Check whether our tip is stale, and if so, allow using an extra
|
||||
// outbound peer
|
||||
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);
|
||||
} else if (m_connman.GetTryNewOutboundPeer()) {
|
||||
m_connman.SetTryNewOutboundPeer(false);
|
||||
|
@ -4570,7 +4570,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||
// If we get here, the outgoing message serialization version is set and can't change.
|
||||
const CNetMsgMaker msgMaker(pto->GetCommonVersion());
|
||||
|
||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||
const auto current_time{GetTime<std::chrono::microseconds>()};
|
||||
|
||||
if (pto->IsAddrFetchConn() && current_time - pto->m_connected > 10 * AVG_ADDRESS_BROADCAST_INTERVAL) {
|
||||
LogPrint(BCLog::NET, "addrfetch connection timeout; disconnecting peer=%d\n", pto->GetId());
|
||||
|
@ -4969,7 +4969,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
|||
|
||||
// Check that outbound peers have reasonable chains
|
||||
// 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)
|
||||
|
|
Loading…
Add table
Reference in a new issue