refactor: Use NodeClock::duration for m_last_ping_time/m_min_ping_time/m_ping_wait
What changed, and why it matters
This is a pure code cleanup (refactor) that renames the type used for ping timing variables from std::chrono::microseconds to NodeClock::duration. The commit message explicitly states it does not change behavior, and the diff shows only type aliases and documentation updates. There is no security issue here.
No action needed. This is a benign refactor with no security relevance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit changes ping-related duration fields (m_last_ping_time, m_min_ping_time, m_ping_wait) from std::chrono::microseconds to NodeClock::duration. NodeClock::duration is the same underlying type (std::chrono::microseconds in Bitcoin Core), so this is a non-functional refactor. It also updates comparisons to use decltype(…)::max() and improves comments. No logic, bounds, or behavior changes are introduced.
Changed components
src/net.hsrc/net_processing.hsrc/node/eviction.hsrc/qt/guiutil.cppsrc/qt/guiutil.hsrc/rpc/net.cppInspect captured patch +13 / −12
diff --git a/src/net.h b/src/net.h
index 5f19074b..135b1fc0 100644
--- a/src/net.h
+++ b/src/net.h
@@ -210,8 +210,8 @@ public:
uint64_t nRecvBytes;
mapMsgTypeSize mapRecvBytesPerMsgType;
NetPermissionFlags m_permission_flags;
- std::chrono::microseconds m_last_ping_time;
- std::chrono::microseconds m_min_ping_time;
+ NodeClock::duration m_last_ping_time;
+ NodeClock::duration m_min_ping_time;
// Our address, as reported by the peer
std::string addrLocal;
// Address of this peer
@@ -890,11 +890,11 @@ public:
std::atomic<std::chrono::seconds> m_last_tx_time{0s};
/// Last measured round-trip duration. Used only for stats.
- std::atomic<std::chrono::microseconds> m_last_ping_time{0us};
+ std::atomic<NodeClock::duration> m_last_ping_time{0us};
/// Lowest measured round-trip duration. Used as an inbound peer eviction
/// criterion in CConnman::AttemptToEvictConnection.
- std::atomic<std::chrono::microseconds> m_min_ping_time{std::chrono::microseconds::max()};
+ std::atomic<NodeClock::duration> m_min_ping_time{NodeClock::duration::max()};
CNode(NodeId id,
std::shared_ptr<Sock> sock,
@@ -981,7 +981,8 @@ public:
std::string DisconnectMsg() const;
/// A ping-pong round trip has completed successfully. Update latest and minimum ping durations.
- void PongReceived(std::chrono::microseconds ping_time) {
+ void PongReceived(NodeClock::duration ping_time)
+ {
m_last_ping_time = ping_time;
m_min_ping_time = std::min(m_min_ping_time.load(), ping_time);
}
diff --git a/src/net_processing.h b/src/net_processing.h
index d2050d8f..8b3f026d 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -52,7 +52,7 @@ static const unsigned int MAX_HEADERS_RESULTS = 2000;
struct CNodeStateStats {
int nSyncHeight = -1;
int nCommonHeight = -1;
- std::chrono::microseconds m_ping_wait;
+ NodeClock::duration m_ping_wait;
std::vector<int> vHeightInFlight;
bool m_relay_txs;
int m_inv_to_send = 0;
diff --git a/src/node/eviction.h b/src/node/eviction.h
index 6ab72644..7230d959 100644
--- a/src/node/eviction.h
+++ b/src/node/eviction.h
@@ -18,7 +18,7 @@ typedef int64_t NodeId;
struct NodeEvictionCandidate {
NodeId id;
std::chrono::seconds m_connected;
- std::chrono::microseconds m_min_ping_time;
+ NodeClock::duration m_min_ping_time;
std::chrono::seconds m_last_block_time;
std::chrono::seconds m_last_tx_time;
bool fRelevantServices;
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index 9cdfe2bc..e0210b05 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -767,9 +767,9 @@ QString formatServicesStr(quint64 mask)
return QObject::tr("None");
}
-QString formatPingTime(std::chrono::microseconds ping_time)
+QString formatPingTime(NodeClock::duration ping_time)
{
- return (ping_time == std::chrono::microseconds::max() || ping_time == 0us) ?
+ return (ping_time == decltype(CNode::m_min_ping_time.load())::max() || ping_time == 0us) ?
QObject::tr("N/A") :
QObject::tr("%1 ms").arg(QString::number(Ticks<std::chrono::milliseconds>(ping_time)));
}
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index f34c4eac..90b8013e 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -237,8 +237,8 @@ namespace GUIUtil
/** Format CNodeStats.nServices bitmask into a user-readable string */
QString formatServicesStr(quint64 mask);
- /** Format a CNodeStats.m_last_ping_time into a user-readable string or display N/A, if 0 */
- QString formatPingTime(std::chrono::microseconds ping_time);
+ /// Format a CNodeStats.m_last_ping_time/m_min_ping_time/m_ping_wait into a user-readable string if it exists, or display N/A
+ QString formatPingTime(NodeClock::duration ping_time);
/** Format a CNodeStateStats.time_offset into a user-readable string */
QString formatTimeOffset(int64_t time_offset);
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
index 03786351..9c71e4ee 100644
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -253,7 +253,7 @@ static RPCHelpMan getpeerinfo()
if (stats.m_last_ping_time > 0us) {
obj.pushKV("pingtime", Ticks<SecondsDouble>(stats.m_last_ping_time));
}
- if (stats.m_min_ping_time < std::chrono::microseconds::max()) {
+ if (stats.m_min_ping_time < decltype(CNode::m_min_ping_time.load())::max()) {
obj.pushKV("minping", Ticks<SecondsDouble>(stats.m_min_ping_time));
}
if (statestats.m_ping_wait > 0s) {
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.