change m_last_block_announcement type from int64_t to NodeSeconds

This commit is contained in:
Larry Ruane 2023-08-14 22:52:43 -06:00
parent f1bcf3edc5
commit 50ed54854a
3 changed files with 14 additions and 10 deletions

View file

@ -461,7 +461,7 @@ struct CNodeState {
ChainSyncTimeoutState m_chain_sync;
//! Time of last new block announcement
int64_t m_last_block_announcement{0};
NodeSeconds m_last_block_announcement{0s};
};
class PeerManagerImpl final : public PeerManager
@ -513,7 +513,7 @@ public:
void ProcessMessage(CNode& pfrom, const std::string& msg_type, DataStream& vRecv,
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) override
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_most_recent_block_mutex, !m_headers_presync_mutex, g_msgproc_mutex, !m_tx_download_mutex);
void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) override;
void UpdateLastBlockAnnounceTime(NodeId node, NodeSeconds time_in_seconds) override;
ServiceFlags GetDesirableServiceFlags(ServiceFlags services) const override;
private:
@ -1513,7 +1513,7 @@ void PeerManagerImpl::PushNodeVersion(CNode& pnode, const Peer& peer)
}
}
void PeerManagerImpl::UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds)
void PeerManagerImpl::UpdateLastBlockAnnounceTime(NodeId node, NodeSeconds time_in_seconds)
{
LOCK(cs_main);
CNodeState *state = State(node);
@ -2770,7 +2770,7 @@ void PeerManagerImpl::UpdatePeerStateForReceivedHeaders(CNode& pfrom, Peer& peer
// are still present, however, as belt-and-suspenders.
if (received_new_header && last_header.nChainWork > m_chainman.ActiveChain().Tip()->nChainWork) {
nodestate->m_last_block_announcement = GetTime();
nodestate->m_last_block_announcement = Now<NodeSeconds>();
}
// If we're in IBD, we want outbound peers that will serve us a useful
@ -4346,7 +4346,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// If this was a new header with more work than our tip, update the
// peer's last block announcement time
if (received_new_header && pindex->nChainWork > m_chainman.ActiveChain().Tip()->nChainWork) {
nodestate->m_last_block_announcement = GetTime();
nodestate->m_last_block_announcement = Now<NodeSeconds>();
}
if (pindex->nStatus & BLOCK_HAVE_DATA) // Nothing to do here
@ -5121,7 +5121,7 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
// Protect peers from eviction if we don't have another connection
// to their network, counting both outbound-full-relay and manual peers.
NodeId worst_peer = -1;
int64_t oldest_block_announcement = std::numeric_limits<int64_t>::max();
std::optional<NodeSeconds> oldest_block_announcement;
m_connman.ForEachNode([&](CNode* pnode) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_connman.GetNodesMutex()) {
AssertLockHeld(::cs_main);
@ -5136,7 +5136,10 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
// If this is the only connection on a particular network that is
// OUTBOUND_FULL_RELAY or MANUAL, protect it.
if (!m_connman.MultipleManualOrFullOutboundConns(pnode->addr.GetNetwork())) return;
if (state->m_last_block_announcement < oldest_block_announcement || (state->m_last_block_announcement == oldest_block_announcement && pnode->GetId() > worst_peer)) {
if (!oldest_block_announcement.has_value() ||
(state->m_last_block_announcement < *oldest_block_announcement) ||
((state->m_last_block_announcement == *oldest_block_announcement) && pnode->GetId() > worst_peer))
{
worst_peer = pnode->GetId();
oldest_block_announcement = state->m_last_block_announcement;
}
@ -5152,7 +5155,8 @@ void PeerManagerImpl::EvictExtraOutboundPeers(std::chrono::seconds now)
// block from.
CNodeState &state = *State(pnode->GetId());
if (now - pnode->m_connected > MINIMUM_CONNECT_TIME && state.vBlocksInFlight.empty()) {
LogDebug(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n", pnode->GetId(), oldest_block_announcement);
LogDebug(BCLog::NET, "disconnecting extra outbound peer=%d (last block announcement received at time %d)\n",
pnode->GetId(), (*oldest_block_announcement).time_since_epoch().count());
pnode->fDisconnect = true;
return true;
} else {

View file

@ -128,7 +128,7 @@ public:
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex) = 0;
/** This function is used for testing the stale tip eviction logic, see denialofservice_tests.cpp */
virtual void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) = 0;
virtual void UpdateLastBlockAnnounceTime(NodeId node, NodeSeconds time_in_seconds) = 0;
/**
* Gets the set of service flags which are "desirable" for a given peer.

View file

@ -197,7 +197,7 @@ BOOST_FIXTURE_TEST_CASE(stale_tip_peer_management, OutboundTest)
// Update the last announced block time for the last
// peer, and check that the next newest node gets evicted.
peerLogic->UpdateLastBlockAnnounceTime(vNodes.back()->GetId(), GetTime());
peerLogic->UpdateLastBlockAnnounceTime(vNodes.back()->GetId(), Now<NodeSeconds>());
peerLogic->CheckForStaleTipAndEvictPeers();
for (int i = 0; i < max_outbound_full_relay - 1; ++i) {