aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interface/node.cpp26
-rw-r--r--src/interface/node.h8
-rw-r--r--src/net_processing.h6
-rw-r--r--src/qt/clientmodel.cpp2
-rw-r--r--src/qt/peertablemodel.cpp36
-rw-r--r--src/qt/peertablemodel.h7
6 files changed, 57 insertions, 28 deletions
diff --git a/src/interface/node.cpp b/src/interface/node.cpp
index 281164779d..1937fe9d9b 100644
--- a/src/interface/node.cpp
+++ b/src/interface/node.cpp
@@ -10,6 +10,7 @@
#include <interface/handler.h>
#include <interface/wallet.h>
#include <net.h>
+#include <net_processing.h>
#include <netaddress.h>
#include <netbase.h>
#include <primitives/block.h>
@@ -79,6 +80,31 @@ class NodeImpl : public Node
{
return g_connman ? g_connman->GetNodeCount(flags) : 0;
}
+ bool getNodesStats(NodesStats& stats) override
+ {
+ stats.clear();
+
+ if (g_connman) {
+ std::vector<CNodeStats> stats_temp;
+ g_connman->GetNodeStats(stats_temp);
+
+ stats.reserve(stats_temp.size());
+ for (auto& node_stats_temp : stats_temp) {
+ stats.emplace_back(std::move(node_stats_temp), false, CNodeStateStats());
+ }
+
+ // Try to retrieve the CNodeStateStats for each node.
+ TRY_LOCK(::cs_main, lockMain);
+ if (lockMain) {
+ for (auto& node_stats : stats) {
+ std::get<1>(node_stats) =
+ GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
+ }
+ }
+ return true;
+ }
+ return false;
+ }
int64_t getTotalBytesRecv() override { return g_connman ? g_connman->GetTotalBytesRecv() : 0; }
int64_t getTotalBytesSent() override { return g_connman ? g_connman->GetTotalBytesSent() : 0; }
size_t getMempoolSize() override { return ::mempool.size(); }
diff --git a/src/interface/node.h b/src/interface/node.h
index 5275030ca1..6288487032 100644
--- a/src/interface/node.h
+++ b/src/interface/node.h
@@ -14,8 +14,12 @@
#include <stddef.h>
#include <stdint.h>
#include <string>
+#include <tuple>
+#include <vector>
+class CNodeStats;
class proxyType;
+struct CNodeStateStats;
namespace interface {
@@ -79,6 +83,10 @@ public:
//! Get number of connections.
virtual size_t getNodeCount(CConnman::NumConnections flags) = 0;
+ //! Get stats for connected nodes.
+ using NodesStats = std::vector<std::tuple<CNodeStats, bool, CNodeStateStats>>;
+ virtual bool getNodesStats(NodesStats& stats) = 0;
+
//! Get total bytes recv.
virtual int64_t getTotalBytesRecv() = 0;
diff --git a/src/net_processing.h b/src/net_processing.h
index 11543129cf..195d0d2033 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -86,9 +86,9 @@ private:
};
struct CNodeStateStats {
- int nMisbehavior;
- int nSyncHeight;
- int nCommonHeight;
+ int nMisbehavior = 0;
+ int nSyncHeight = -1;
+ int nCommonHeight = -1;
std::vector<int> vHeightInFlight;
};
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index 213068a490..84cfb79549 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -42,7 +42,7 @@ ClientModel::ClientModel(interface::Node& node, OptionsModel *_optionsModel, QOb
{
cachedBestHeaderHeight = -1;
cachedBestHeaderTime = -1;
- peerTableModel = new PeerTableModel(this);
+ peerTableModel = new PeerTableModel(m_node, this);
banTableModel = new BanTableModel(this);
pollTimer = new QTimer(this);
connect(pollTimer, SIGNAL(timeout()), this, SLOT(updateTimer()));
diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp
index 0a57dcfca3..f33db8e761 100644
--- a/src/qt/peertablemodel.cpp
+++ b/src/qt/peertablemodel.cpp
@@ -8,6 +8,7 @@
#include <qt/guiconstants.h>
#include <qt/guiutil.h>
+#include <interface/node.h>
#include <validation.h> // for cs_main
#include <sync.h>
@@ -56,38 +57,26 @@ public:
std::map<NodeId, int> mapNodeRows;
/** Pull a full list of peers from vNodes into our cache */
- void refreshPeers()
+ void refreshPeers(interface::Node& node)
{
{
cachedNodeStats.clear();
- std::vector<CNodeStats> vstats;
- if(g_connman)
- g_connman->GetNodeStats(vstats);
+
+ interface::Node::NodesStats nodes_stats;
+ node.getNodesStats(nodes_stats);
#if QT_VERSION >= 0x040700
- cachedNodeStats.reserve(vstats.size());
+ cachedNodeStats.reserve(nodes_stats.size());
#endif
- for (const CNodeStats& nodestats : vstats)
+ for (auto& node_stats : nodes_stats)
{
CNodeCombinedStats stats;
- stats.nodeStateStats.nMisbehavior = 0;
- stats.nodeStateStats.nSyncHeight = -1;
- stats.nodeStateStats.nCommonHeight = -1;
- stats.fNodeStateStatsAvailable = false;
- stats.nodeStats = nodestats;
+ stats.nodeStats = std::get<0>(node_stats);
+ stats.fNodeStateStatsAvailable = std::get<1>(node_stats);
+ stats.nodeStateStats = std::get<2>(node_stats);
cachedNodeStats.append(stats);
}
}
- // Try to retrieve the CNodeStateStats for each node.
- {
- TRY_LOCK(cs_main, lockMain);
- if (lockMain)
- {
- for (CNodeCombinedStats &stats : cachedNodeStats)
- stats.fNodeStateStatsAvailable = GetNodeStateStats(stats.nodeStats.nodeid, stats.nodeStateStats);
- }
- }
-
if (sortColumn >= 0)
// sort cacheNodeStats (use stable sort to prevent rows jumping around unnecessarily)
qStableSort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder));
@@ -113,8 +102,9 @@ public:
}
};
-PeerTableModel::PeerTableModel(ClientModel *parent) :
+PeerTableModel::PeerTableModel(interface::Node& node, ClientModel *parent) :
QAbstractTableModel(parent),
+ m_node(node),
clientModel(parent),
timer(0)
{
@@ -235,7 +225,7 @@ const CNodeCombinedStats *PeerTableModel::getNodeStats(int idx)
void PeerTableModel::refresh()
{
Q_EMIT layoutAboutToBeChanged();
- priv->refreshPeers();
+ priv->refreshPeers(m_node);
Q_EMIT layoutChanged();
}
diff --git a/src/qt/peertablemodel.h b/src/qt/peertablemodel.h
index e3c9c6e5a3..3db2f34778 100644
--- a/src/qt/peertablemodel.h
+++ b/src/qt/peertablemodel.h
@@ -14,6 +14,10 @@
class ClientModel;
class PeerTablePriv;
+namespace interface {
+class Node;
+}
+
QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE
@@ -45,7 +49,7 @@ class PeerTableModel : public QAbstractTableModel
Q_OBJECT
public:
- explicit PeerTableModel(ClientModel *parent = 0);
+ explicit PeerTableModel(interface::Node& node, ClientModel *parent = 0);
~PeerTableModel();
const CNodeCombinedStats *getNodeStats(int idx);
int getRowByNodeId(NodeId nodeid);
@@ -76,6 +80,7 @@ public Q_SLOTS:
void refresh();
private:
+ interface::Node& m_node;
ClientModel *clientModel;
QStringList columns;
std::unique_ptr<PeerTablePriv> priv;