From b054c46977667953593819248c167545aa3e7a40 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 3 Mar 2020 08:35:01 -0500 Subject: [PATCH 1/4] refactor: Convert ping time from double to int64_t --- src/net.cpp | 2 +- src/net.h | 2 +- src/qt/guiutil.cpp | 5 +++++ src/qt/guiutil.h | 3 +++ src/qt/rpcconsole.cpp | 2 +- src/rpc/net.cpp | 4 ++-- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index cb4067e825e..a1d1bf5cbf4 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -555,7 +555,7 @@ void CNode::copyStats(CNodeStats &stats, const std::vector &m_asmap) } // Raw ping time is in microseconds, but show it to user as whole seconds (Bitcoin users should be well used to small numbers with many decimal places by now :) - stats.dPingTime = (((double)nPingUsecTime) / 1e6); + stats.m_ping_usec = nPingUsecTime; stats.dMinPing = (((double)nMinPingUsecTime) / 1e6); stats.dPingWait = (((double)nPingUsecWait) / 1e6); diff --git a/src/net.h b/src/net.h index 7d3eaa2e0db..17d1d67dea7 100644 --- a/src/net.h +++ b/src/net.h @@ -596,7 +596,7 @@ public: mapMsgCmdSize mapRecvBytesPerMsgCmd; NetPermissionFlags m_permissionFlags; bool m_legacyWhitelisted; - double dPingTime; + int64_t m_ping_usec; double dPingWait; double dMinPing; CAmount minFeeFilter; diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 911322092c9..88dc87a7fc8 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -778,6 +778,11 @@ QString formatPingTime(double dPingTime) return (dPingTime == std::numeric_limits::max()/1e6 || dPingTime == 0) ? QObject::tr("N/A") : QString(QObject::tr("%1 ms")).arg(QString::number((int)(dPingTime * 1000), 10)); } +QString formatPingTime(int64_t ping_usec) +{ + return (ping_usec == std::numeric_limits::max() || ping_usec == 0) ? QObject::tr("N/A") : QString(QObject::tr("%1 ms")).arg(QString::number((int)(ping_usec / 1000), 10)); +} + QString formatTimeOffset(int64_t nTimeOffset) { return QString(QObject::tr("%1 s")).arg(QString::number((int)nTimeOffset, 10)); diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 05e73cc5f0c..913d38c48a3 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -205,6 +205,9 @@ namespace GUIUtil /* Format a CNodeCombinedStats.dPingTime into a user-readable string or display N/A, if 0*/ QString formatPingTime(double dPingTime); + /* Format a CNodeStats.m_ping_usec into a user-readable string or display N/A, if 0*/ + QString formatPingTime(int64_t ping_usec); + /* Format a CNodeCombinedStats.nTimeOffset into a user-readable string. */ QString formatTimeOffset(int64_t nTimeOffset); diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index e1f783b0e58..152d3a415fb 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -1109,7 +1109,7 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats) ui->peerBytesSent->setText(GUIUtil::formatBytes(stats->nodeStats.nSendBytes)); ui->peerBytesRecv->setText(GUIUtil::formatBytes(stats->nodeStats.nRecvBytes)); ui->peerConnTime->setText(GUIUtil::formatDurationStr(GetSystemTimeInSeconds() - stats->nodeStats.nTimeConnected)); - ui->peerPingTime->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingTime)); + ui->peerPingTime->setText(GUIUtil::formatPingTime(stats->nodeStats.m_ping_usec)); ui->peerPingWait->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingWait)); ui->peerMinPing->setText(GUIUtil::formatPingTime(stats->nodeStats.dMinPing)); ui->timeoffset->setText(GUIUtil::formatTimeOffset(stats->nodeStats.nTimeOffset)); diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index 92542539dfd..628e85ce019 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -165,8 +165,8 @@ static UniValue getpeerinfo(const JSONRPCRequest& request) obj.pushKV("bytesrecv", stats.nRecvBytes); obj.pushKV("conntime", stats.nTimeConnected); obj.pushKV("timeoffset", stats.nTimeOffset); - if (stats.dPingTime > 0.0) - obj.pushKV("pingtime", stats.dPingTime); + if (stats.m_ping_usec > 0) + obj.pushKV("pingtime", stats.m_ping_usec / 1e6); if (stats.dMinPing < static_cast(std::numeric_limits::max())/1e6) obj.pushKV("minping", stats.dMinPing); if (stats.dPingWait > 0.0) From e6fc63ec7ee637a4b533e4d7b22def05e74e1dff Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 3 Mar 2020 08:40:29 -0500 Subject: [PATCH 2/4] refactor: Convert min ping time from double to int64_t --- src/net.cpp | 2 +- src/net.h | 2 +- src/qt/peertablemodel.cpp | 4 ++-- src/qt/rpcconsole.cpp | 2 +- src/rpc/net.cpp | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index a1d1bf5cbf4..8177ca3e3b4 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -556,7 +556,7 @@ void CNode::copyStats(CNodeStats &stats, const std::vector &m_asmap) // Raw ping time is in microseconds, but show it to user as whole seconds (Bitcoin users should be well used to small numbers with many decimal places by now :) stats.m_ping_usec = nPingUsecTime; - stats.dMinPing = (((double)nMinPingUsecTime) / 1e6); + stats.m_min_ping_usec = nMinPingUsecTime; stats.dPingWait = (((double)nPingUsecWait) / 1e6); // Leave string empty if addrLocal invalid (not filled in yet) diff --git a/src/net.h b/src/net.h index 17d1d67dea7..7cb7c485fa5 100644 --- a/src/net.h +++ b/src/net.h @@ -598,7 +598,7 @@ public: bool m_legacyWhitelisted; int64_t m_ping_usec; double dPingWait; - double dMinPing; + int64_t m_min_ping_usec; CAmount minFeeFilter; // Our address, as reported by the peer std::string addrLocal; diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index a497f58b16a..a1fc7915363 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -32,7 +32,7 @@ bool NodeLessThan::operator()(const CNodeCombinedStats &left, const CNodeCombine case PeerTableModel::Subversion: return pLeft->cleanSubVer.compare(pRight->cleanSubVer) < 0; case PeerTableModel::Ping: - return pLeft->dMinPing < pRight->dMinPing; + return pLeft->m_min_ping_usec < pRight->m_min_ping_usec; case PeerTableModel::Sent: return pLeft->nSendBytes < pRight->nSendBytes; case PeerTableModel::Received: @@ -161,7 +161,7 @@ QVariant PeerTableModel::data(const QModelIndex &index, int role) const case Subversion: return QString::fromStdString(rec->nodeStats.cleanSubVer); case Ping: - return GUIUtil::formatPingTime(rec->nodeStats.dMinPing); + return GUIUtil::formatPingTime(rec->nodeStats.m_min_ping_usec); case Sent: return GUIUtil::formatBytes(rec->nodeStats.nSendBytes); case Received: diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 152d3a415fb..896675a4936 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -1111,7 +1111,7 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats) ui->peerConnTime->setText(GUIUtil::formatDurationStr(GetSystemTimeInSeconds() - stats->nodeStats.nTimeConnected)); ui->peerPingTime->setText(GUIUtil::formatPingTime(stats->nodeStats.m_ping_usec)); ui->peerPingWait->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingWait)); - ui->peerMinPing->setText(GUIUtil::formatPingTime(stats->nodeStats.dMinPing)); + ui->peerMinPing->setText(GUIUtil::formatPingTime(stats->nodeStats.m_min_ping_usec)); ui->timeoffset->setText(GUIUtil::formatTimeOffset(stats->nodeStats.nTimeOffset)); ui->peerVersion->setText(QString("%1").arg(QString::number(stats->nodeStats.nVersion))); ui->peerSubversion->setText(QString::fromStdString(stats->nodeStats.cleanSubVer)); diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index 628e85ce019..c1b350526da 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -167,8 +167,8 @@ static UniValue getpeerinfo(const JSONRPCRequest& request) obj.pushKV("timeoffset", stats.nTimeOffset); if (stats.m_ping_usec > 0) obj.pushKV("pingtime", stats.m_ping_usec / 1e6); - if (stats.dMinPing < static_cast(std::numeric_limits::max())/1e6) - obj.pushKV("minping", stats.dMinPing); + if (stats.m_min_ping_usec < std::numeric_limits::max()) + obj.pushKV("minping", stats.m_min_ping_usec / 1e6); if (stats.dPingWait > 0.0) obj.pushKV("pingwait", stats.dPingWait); obj.pushKV("version", stats.nVersion); From 7a810b1d7a9d03818706dc94457dc3255f062796 Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Tue, 3 Mar 2020 08:42:50 -0500 Subject: [PATCH 3/4] refactor: Convert ping wait time from double to int64_t --- src/net.cpp | 2 +- src/net.h | 2 +- src/qt/guiutil.cpp | 5 ----- src/qt/guiutil.h | 3 --- src/qt/rpcconsole.cpp | 2 +- src/rpc/net.cpp | 4 ++-- 6 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 8177ca3e3b4..d1564503946 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -557,7 +557,7 @@ void CNode::copyStats(CNodeStats &stats, const std::vector &m_asmap) // Raw ping time is in microseconds, but show it to user as whole seconds (Bitcoin users should be well used to small numbers with many decimal places by now :) stats.m_ping_usec = nPingUsecTime; stats.m_min_ping_usec = nMinPingUsecTime; - stats.dPingWait = (((double)nPingUsecWait) / 1e6); + stats.m_ping_wait_usec = nPingUsecWait; // Leave string empty if addrLocal invalid (not filled in yet) CService addrLocalUnlocked = GetAddrLocal(); diff --git a/src/net.h b/src/net.h index 7cb7c485fa5..975d7f15d74 100644 --- a/src/net.h +++ b/src/net.h @@ -597,7 +597,7 @@ public: NetPermissionFlags m_permissionFlags; bool m_legacyWhitelisted; int64_t m_ping_usec; - double dPingWait; + int64_t m_ping_wait_usec; int64_t m_min_ping_usec; CAmount minFeeFilter; // Our address, as reported by the peer diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 88dc87a7fc8..98dde1656a6 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -773,11 +773,6 @@ QString formatServicesStr(quint64 mask) return QObject::tr("None"); } -QString formatPingTime(double dPingTime) -{ - return (dPingTime == std::numeric_limits::max()/1e6 || dPingTime == 0) ? QObject::tr("N/A") : QString(QObject::tr("%1 ms")).arg(QString::number((int)(dPingTime * 1000), 10)); -} - QString formatPingTime(int64_t ping_usec) { return (ping_usec == std::numeric_limits::max() || ping_usec == 0) ? QObject::tr("N/A") : QString(QObject::tr("%1 ms")).arg(QString::number((int)(ping_usec / 1000), 10)); diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 913d38c48a3..e5712624431 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -202,9 +202,6 @@ namespace GUIUtil /* Format CNodeStats.nServices bitmask into a user-readable string */ QString formatServicesStr(quint64 mask); - /* Format a CNodeCombinedStats.dPingTime into a user-readable string or display N/A, if 0*/ - QString formatPingTime(double dPingTime); - /* Format a CNodeStats.m_ping_usec into a user-readable string or display N/A, if 0*/ QString formatPingTime(int64_t ping_usec); diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 896675a4936..b82ab9ffe82 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -1110,7 +1110,7 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats) ui->peerBytesRecv->setText(GUIUtil::formatBytes(stats->nodeStats.nRecvBytes)); ui->peerConnTime->setText(GUIUtil::formatDurationStr(GetSystemTimeInSeconds() - stats->nodeStats.nTimeConnected)); ui->peerPingTime->setText(GUIUtil::formatPingTime(stats->nodeStats.m_ping_usec)); - ui->peerPingWait->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingWait)); + ui->peerPingWait->setText(GUIUtil::formatPingTime(stats->nodeStats.m_ping_wait_usec)); ui->peerMinPing->setText(GUIUtil::formatPingTime(stats->nodeStats.m_min_ping_usec)); ui->timeoffset->setText(GUIUtil::formatTimeOffset(stats->nodeStats.nTimeOffset)); ui->peerVersion->setText(QString("%1").arg(QString::number(stats->nodeStats.nVersion))); diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index c1b350526da..e8ae458c575 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -169,8 +169,8 @@ static UniValue getpeerinfo(const JSONRPCRequest& request) obj.pushKV("pingtime", stats.m_ping_usec / 1e6); if (stats.m_min_ping_usec < std::numeric_limits::max()) obj.pushKV("minping", stats.m_min_ping_usec / 1e6); - if (stats.dPingWait > 0.0) - obj.pushKV("pingwait", stats.dPingWait); + if (stats.m_ping_wait_usec > 0) + obj.pushKV("pingwait", stats.m_ping_wait_usec / 1e6); obj.pushKV("version", stats.nVersion); // Use the sanitized form of subver here, to avoid tricksy remote peers from // corrupting or modifying the JSON output by putting special characters in From 1891245e7318bf625bbf67aab08a79fc3e87b61d Mon Sep 17 00:00:00 2001 From: Ben Woosley Date: Thu, 5 Mar 2020 04:44:45 -0500 Subject: [PATCH 4/4] refactor: Cast ping values to double before output Note the divisor is a floating point literal so presumably also floating point. --- src/rpc/net.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index e8ae458c575..97fe99b8c1c 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -165,12 +165,15 @@ static UniValue getpeerinfo(const JSONRPCRequest& request) obj.pushKV("bytesrecv", stats.nRecvBytes); obj.pushKV("conntime", stats.nTimeConnected); obj.pushKV("timeoffset", stats.nTimeOffset); - if (stats.m_ping_usec > 0) - obj.pushKV("pingtime", stats.m_ping_usec / 1e6); - if (stats.m_min_ping_usec < std::numeric_limits::max()) - obj.pushKV("minping", stats.m_min_ping_usec / 1e6); - if (stats.m_ping_wait_usec > 0) - obj.pushKV("pingwait", stats.m_ping_wait_usec / 1e6); + if (stats.m_ping_usec > 0) { + obj.pushKV("pingtime", ((double)stats.m_ping_usec) / 1e6); + } + if (stats.m_min_ping_usec < std::numeric_limits::max()) { + obj.pushKV("minping", ((double)stats.m_min_ping_usec) / 1e6); + } + if (stats.m_ping_wait_usec > 0) { + obj.pushKV("pingwait", ((double)stats.m_ping_wait_usec) / 1e6); + } obj.pushKV("version", stats.nVersion); // Use the sanitized form of subver here, to avoid tricksy remote peers from // corrupting or modifying the JSON output by putting special characters in