diff --git a/src/cpp/ripple/ripple.proto b/src/cpp/ripple/ripple.proto index 25180b4010..cc098a8bdf 100644 --- a/src/cpp/ripple/ripple.proto +++ b/src/cpp/ripple/ripple.proto @@ -81,11 +81,10 @@ message TMHello message TMClusterNode { required bytes publicKey = 1; - required uint32 reportSeq = 2; - optional string nodeName = 3; - optional uint32 nodeLoad = 4; - optional uint32 lastHeard = 5; - optional string address = 6; + required uint32 reportTime = 2; + required uint32 nodeLoad = 3; + optional string nodeName = 4; + optional string address = 5; } // The status of all nodes in the cluster diff --git a/src/cpp/ripple/ripple_ClusterNodeStatus.h b/src/cpp/ripple/ripple_ClusterNodeStatus.h index da2465650c..aa2afdd1ed 100644 --- a/src/cpp/ripple/ripple_ClusterNodeStatus.h +++ b/src/cpp/ripple/ripple_ClusterNodeStatus.h @@ -8,15 +8,14 @@ class ClusterNodeStatus { public: - ClusterNodeStatus() : mSeq(0), mLoadFee(0), mReportTime(0) + ClusterNodeStatus() : mLoadFee(0), mReportTime(0) { ; } - ClusterNodeStatus(std::string const& name) : mNodeName(name), mSeq(0), mLoadFee(0), mReportTime(0) + ClusterNodeStatus(std::string const& name) : mNodeName(name), mLoadFee(0), mReportTime(0) { ; } - ClusterNodeStatus(uint32 seq, const std::string& name, uint32 fee, uint32 rtime) : + ClusterNodeStatus(const std::string& name, uint32 fee, uint32 rtime) : mNodeName(name), - mSeq(seq), mLoadFee(fee), mReportTime(rtime) { ; } @@ -26,11 +25,6 @@ public: return mNodeName; } - uint32 getSeq() - { - return mSeq; - } - uint32 getLoadFee() { return mLoadFee; @@ -43,9 +37,8 @@ public: void update(ClusterNodeStatus const& status) { - if (status.mSeq > mSeq) + if (status.mReportTime > mReportTime) { - mSeq = status.mSeq; mLoadFee = status.mLoadFee; mReportTime = status.mReportTime; if (mNodeName.empty() || !status.mNodeName.empty()) @@ -55,7 +48,6 @@ public: private: std::string mNodeName; - uint32 mSeq; uint32 mLoadFee; uint32 mReportTime; }; diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 11b5eee7ad..8f5c1634c5 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1429,9 +1429,18 @@ void PeerImp::recvCluster (protocol::TMCluster& packet) { protocol::TMClusterNode const& node = packet.clusternodes(i); - // Extract RippleAddress and build ClusterNodeStatus - // WRITEME + std::string name; + if (node.has_nodename()) + name = node.nodename(); + ClusterNodeStatus s(name, node.nodeload(), node.reporttime()); + + RippleAddress nodePub; + nodePub.setNodePublic(node.publickey()); + + getApp().getUNL().nodeUpdate(nodePub, s); } + + getApp().getFeeTrack().setClusterFee(getApp().getUNL().getClusterFee()); } void PeerImp::recvGetValidation (protocol::TMGetValidations& packet) diff --git a/src/cpp/ripple/ripple_UniqueNodeList.cpp b/src/cpp/ripple/ripple_UniqueNodeList.cpp index 68db3b3979..a1ffbc3b7d 100644 --- a/src/cpp/ripple/ripple_UniqueNodeList.cpp +++ b/src/cpp/ripple/ripple_UniqueNodeList.cpp @@ -342,6 +342,35 @@ public: //-------------------------------------------------------------------------- + uint32 getClusterFee () + { + uint64 totFee = 0; + int totCount = 0; + + int thresh = getApp().getOPs().getNetworkTimeNC(); + if (thresh <= 120) + thresh = 1; + else + thresh -= 120; + + boost::recursive_mutex::scoped_lock sl (mUNLLock); + { + for (std::map::iterator it = m_clusterNodes.begin(), + end = m_clusterNodes.end(); it != end; ++it) + { + if (it->second.getReportTime() >= thresh) + { + ++totCount; + totFee += it->second.getLoadFee(); + } + } + } + + return (totCount == 0) ? 0 : static_cast(totFee / totCount); + } + + //-------------------------------------------------------------------------- + void nodeBootstrap () { int iDomains = 0; diff --git a/src/cpp/ripple/ripple_UniqueNodeList.h b/src/cpp/ripple/ripple_UniqueNodeList.h index 32b2158d8d..29f92b83a1 100644 --- a/src/cpp/ripple/ripple_UniqueNodeList.h +++ b/src/cpp/ripple/ripple_UniqueNodeList.h @@ -47,6 +47,7 @@ public: virtual bool nodeInCluster (const RippleAddress& naNodePublic, std::string& name) = 0; virtual void nodeUpdate (const RippleAddress& naNodePublic, ClusterNodeStatus const& cnsStatus) = 0; virtual std::map getClusterStatus () = 0; + virtual uint32 getClusterFee () = 0; virtual void nodeBootstrap () = 0; virtual bool nodeLoad (boost::filesystem::path pConfig) = 0;