@ -39,6 +39,8 @@
# include <validation.h>
# include <algorithm>
# include <atomic>
# include <chrono>
# include <memory>
# include <optional>
# include <typeinfo>
@ -57,10 +59,10 @@ static constexpr auto HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1ms;
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
/** How frequently to check for stale tips , in seconds */
static constexpr int64_t STALE_CHECK_INTERVAL = 10 * 60 ; // 10 minutes
/** How frequently to check for extra outbound peers and disconnect , in seconds */
static constexpr int64_t EXTRA_PEER_CHECK_INTERVAL = 45 ;
/** How frequently to check for stale tips */
static constexpr auto STALE_CHECK_INTERVAL { 10 min } ;
/** How frequently to check for extra outbound peers and disconnect */
static constexpr auto EXTRA_PEER_CHECK_INTERVAL { 45 s } ;
/** Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict */
static constexpr std : : chrono : : seconds MINIMUM_CONNECT_TIME { 30 } ;
/** SHA256("main address relay")[0:8] */
@ -422,7 +424,7 @@ private:
std : : atomic < int > m_best_height { - 1 } ;
/** Next time to check for stale tip */
int64_t m_stale_tip_check_time { 0 } ;
std : : chrono : : seconds m_stale_tip_check_time { 0 s } ;
/** Whether this node is running in blocks only mode */
const bool m_ignore_incoming_txs ;
@ -541,7 +543,7 @@ private:
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 } ;
std : : atomic < std : : chrono : : seconds > m_last_tip_update { 0 s } ;
/** Determine whether or not a peer can request a transaction, and return it (or nullptr if not found or not allowed). */
CTransactionRef FindTxForGetData ( const CNode & peer , const GenTxid & gtxid , const std : : chrono : : seconds mempool_req , const std : : chrono : : seconds now ) LOCKS_EXCLUDED ( cs_main ) ;
@ -947,10 +949,10 @@ bool PeerManagerImpl::TipMayBeStale()
{
AssertLockHeld ( cs_main ) ;
const Consensus : : Params & consensusParams = m_chainparams . GetConsensus ( ) ;
if ( m_last_tip_update = = 0 ) {
m_last_tip_update = GetTime ( ) ;
if ( count_seconds( m_last_tip_update) = = 0 ) {
m_last_tip_update = GetTime < std : : chrono : : seconds > ( ) ;
}
return m_last_tip_update < GetTime ( ) - consensusParams . nPowTargetSpacing * 3 & & mapBlocksInFlight . empty ( ) ;
return count_seconds ( m_last_tip_update ) < GetTime ( ) - consensusParams . nPowTargetSpacing * 3 & & mapBlocksInFlight . empty ( ) ;
}
bool PeerManagerImpl : : CanDirectFetch ( )
@ -1506,7 +1508,7 @@ void PeerManagerImpl::StartScheduledTasks(CScheduler& scheduler)
void PeerManagerImpl : : BlockConnected ( const std : : shared_ptr < const CBlock > & pblock , const CBlockIndex * pindex )
{
m_orphanage . EraseForBlock ( * pblock ) ;
m_last_tip_update = GetTime ( ) ;
m_last_tip_update = GetTime < std : : chrono : : seconds > ( ) ;
{
LOCK ( m_recent_confirmed_transactions_mutex ) ;
@ -4338,20 +4340,20 @@ void PeerManagerImpl::CheckForStaleTipAndEvictPeers()
{
LOCK ( cs_main ) ;
int64_t time_in_seconds = GetTime ( ) ;
auto now { GetTime < std : : chrono : : seconds > ( ) } ;
EvictExtraOutboundPeers ( std: : chrono : : seconds { time_in_seconds } ) ;
EvictExtraOutboundPeers ( now ) ;
if ( time_in_seconds > m_stale_tip_check_time ) {
if ( now > m_stale_tip_check_time ) {
// 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 " , time_in_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 ) - count_seconds ( m_last_tip_update ) ) ;
m_connman . SetTryNewOutboundPeer ( true ) ;
} else if ( m_connman . GetTryNewOutboundPeer ( ) ) {
m_connman . SetTryNewOutboundPeer ( false ) ;
}
m_stale_tip_check_time = time_in_seconds + STALE_CHECK_INTERVAL ;
m_stale_tip_check_time = now + STALE_CHECK_INTERVAL ;
}
if ( ! m_initial_sync_finished & & CanDirectFetch ( ) ) {