From 7d9c3ec622d73a98d07ab3cee78751718982a5bc Mon Sep 17 00:00:00 2001 From: dergoegge Date: Mon, 27 Nov 2023 17:22:41 +0000 Subject: [PATCH] [net processing] Introduce PeerManagerInfo For querying statistics/info from PeerManager. The median outbound time offset is the only initial field. --- src/net_processing.cpp | 8 ++++++++ src/net_processing.h | 7 +++++++ src/rpc/net.cpp | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index b549178677e..6289d139893 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -518,6 +518,7 @@ public: std::optional FetchBlock(NodeId peer_id, const CBlockIndex& block_index) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); + PeerManagerInfo GetInfo() const override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); bool IgnoresIncomingTxs() override { return m_opts.ignore_incoming_txs; } void SendPings() override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); void RelayTransaction(const uint256& txid, const uint256& wtxid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex); @@ -1804,6 +1805,13 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c return true; } +PeerManagerInfo PeerManagerImpl::GetInfo() const +{ + return PeerManagerInfo{ + .median_outbound_time_offset = m_outbound_time_offsets.Median(), + }; +} + void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx) { if (m_opts.max_extra_txs <= 0) diff --git a/src/net_processing.h b/src/net_processing.h index 452a973d54d..d0ff02311b8 100644 --- a/src/net_processing.h +++ b/src/net_processing.h @@ -46,6 +46,10 @@ struct CNodeStateStats { std::chrono::seconds time_offset{0}; }; +struct PeerManagerInfo { + std::chrono::seconds median_outbound_time_offset{0s}; +}; + class PeerManager : public CValidationInterface, public NetEventsInterface { public: @@ -86,6 +90,9 @@ public: /** Get statistics from node state */ virtual bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const = 0; + /** Get peer manager info. */ + virtual PeerManagerInfo GetInfo() const = 0; + /** Whether this node ignores txs received over p2p. */ virtual bool IgnoresIncomingTxs() = 0; diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index 176cf0e404b..823b6d620fd 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -679,9 +678,10 @@ static RPCHelpMan getnetworkinfo() obj.pushKV("localservicesnames", GetServicesNames(services)); } if (node.peerman) { + auto peerman_info{node.peerman->GetInfo()}; obj.pushKV("localrelay", !node.peerman->IgnoresIncomingTxs()); + obj.pushKV("timeoffset", Ticks(peerman_info.median_outbound_time_offset)); } - obj.pushKV("timeoffset", GetTimeOffset()); if (node.connman) { obj.pushKV("networkactive", node.connman->GetNetworkActive()); obj.pushKV("connections", node.connman->GetNodeCount(ConnectionDirection::Both));