diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index ede833e752..6149e80c74 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -803,6 +803,8 @@ Json::Value RPCHandler::doPeers (Json::Value, LoadType* loadType, ScopedLock& Ma jvResult["peers"] = getApp().getPeers ().getPeersJson (); + getApp().getUNL().addClusterStatus(jvResult); + return jvResult; } diff --git a/src/cpp/ripple/ripple_UniqueNodeList.cpp b/src/cpp/ripple/ripple_UniqueNodeList.cpp index 1bceada5a5..b4acf16519 100644 --- a/src/cpp/ripple/ripple_UniqueNodeList.cpp +++ b/src/cpp/ripple/ripple_UniqueNodeList.cpp @@ -371,6 +371,37 @@ public: //-------------------------------------------------------------------------- + void addClusterStatus (Json::Value& obj) + { + boost::recursive_mutex::scoped_lock sl (mUNLLock); + if (m_clusterNodes.size() > 1) // nodes other than us + { + int now = getApp().getOPs().getNetworkTimeNC(); + uint32 ref = getApp().getFeeTrack().getLoadBase(); + Json::Value& nodes = (obj["cluster"] = Json::objectValue); + + for (std::map::iterator it = m_clusterNodes.begin(), + end = m_clusterNodes.end(); it != end; ++it) + { + if (it->first != getApp().getLocalCredentials().getNodePublic()) + { + Json::Value& node = nodes[it->first.humanNodePublic()]; + + if (!it->second.getName().empty()) + node["tag"] = it->second.getName(); + + if ((it->second.getLoadFee() != ref) && (it->second.getLoadFee() != 0)) + node["fee"] = static_cast(it->second.getLoadFee()) / ref; + + if (it->second.getReportTime() != 0) + node["age"] = (it->second.getReportTime() >= now) ? 0 : (now - it->second.getReportTime()); + } + } + } + } + + //-------------------------------------------------------------------------- + void nodeBootstrap () { int iDomains = 0; diff --git a/src/cpp/ripple/ripple_UniqueNodeList.h b/src/cpp/ripple/ripple_UniqueNodeList.h index 6e5a6f0396..c77f8a00c0 100644 --- a/src/cpp/ripple/ripple_UniqueNodeList.h +++ b/src/cpp/ripple/ripple_UniqueNodeList.h @@ -48,6 +48,7 @@ public: virtual bool nodeUpdate (const RippleAddress& naNodePublic, ClusterNodeStatus const& cnsStatus) = 0; virtual std::map getClusterStatus () = 0; virtual uint32 getClusterFee () = 0; + virtual void addClusterStatus (Json::Value&) = 0; virtual void nodeBootstrap () = 0; virtual bool nodeLoad (boost::filesystem::path pConfig) = 0;