From 01b3e9e0ae44f3c57f4a3153df26ed9a2c7bf77e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 15 Jan 2013 19:05:30 -0800 Subject: [PATCH 1/5] Add 'getValidatedLedger' to get the last fully-validated ledger. We should probably audit calls to 'getClosedLedger' to see if they should use this instead. --- src/cpp/ripple/LedgerMaster.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 35b1d0acd6..514b055517 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -67,10 +67,13 @@ public: ScopedLock getLock() { return ScopedLock(mLock); } // The current ledger is the ledger we believe new transactions should go in - Ledger::ref getCurrentLedger() { return mCurrentLedger; } + Ledger::ref getCurrentLedger() { return mCurrentLedger; } // The finalized ledger is the last closed/accepted ledger - Ledger::ref getClosedLedger() { return mFinalizedLedger; } + Ledger::ref getClosedLedger() { return mFinalizedLedger; } + + // The published ledger is the last fully validated ledger + Ledger::ref getValidatedLedger() { return mPubLedger; } TER doTransaction(const SerializedTransaction& txn, TransactionEngineParams params); From 8191153dce70361684fb65b25c0f4d5521600da4 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 15 Jan 2013 19:16:20 -0800 Subject: [PATCH 2/5] Split into server_info (for humans) and server_state (for machines). Allow either without admin privileges, filter information out from non-admins. Cleanup and improve data in all cases. --- src/cpp/ripple/CallRPC.cpp | 1 + src/cpp/ripple/NetworkOPs.cpp | 55 ++++++++++++++++++++++++++--------- src/cpp/ripple/NetworkOPs.h | 3 +- src/cpp/ripple/RPCHandler.cpp | 14 +++++++-- src/cpp/ripple/RPCHandler.h | 3 +- 5 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp index b64f94ab67..424f64a731 100644 --- a/src/cpp/ripple/CallRPC.cpp +++ b/src/cpp/ripple/CallRPC.cpp @@ -492,6 +492,7 @@ Json::Value RPCParser::parseCommand(std::string strMethod, Json::Value jvParams) { "sign", &RPCParser::parseSignSubmit, 2, 2 }, { "submit", &RPCParser::parseSignSubmit, 1, 2 }, { "server_info", &RPCParser::parseAsIs, 0, 0 }, + { "server_state", &RPCParser::parseAsIs, 0, 0 }, { "stop", &RPCParser::parseAsIs, 0, 0 }, // { "transaction_entry", &RPCParser::parseTransactionEntry, -1, -1 }, { "tx", &RPCParser::parseTx, 1, 1 }, diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index f0020b0b64..e74374df99 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1093,7 +1093,7 @@ bool NetworkOPs::recvValidation(const SerializedValidation::pointer& val) return theApp->getValidations().addValidation(val); } -Json::Value NetworkOPs::getServerInfo(bool admin) +Json::Value NetworkOPs::getServerInfo(bool human, bool admin) { Json::Value info = Json::objectValue; @@ -1126,29 +1126,58 @@ Json::Value NetworkOPs::getServerInfo(bool admin) Json::Value lastClose = Json::objectValue; lastClose["proposers"] = theApp->getOPs().getPreviousProposers(); - lastClose["converge_time"] = static_cast(theApp->getOPs().getPreviousConvergeTime()) / 1000.0; + if (human) + lastClose["converge_time_s"] = static_cast(theApp->getOPs().getPreviousConvergeTime()) / 1000.0; + else + lastClose["converge_time"] = Json::Int(theApp->getOPs().getPreviousConvergeTime()); info["last_close"] = lastClose; // if (mConsensus) // info["consensus"] = mConsensus->getJson(); - info["load"] = theApp->getJobQueue().getJson(); - info["load_factor"] = - static_cast(theApp->getFeeTrack().getLoadBase()) / theApp->getFeeTrack().getLoadFactor(); + if (admin) + info["load"] = theApp->getJobQueue().getJson(); + + if (!human) + { + info["load_base"] = theApp->getFeeTrack().getLoadBase(); + info["load_factor"] = theApp->getFeeTrack().getLoadFactor(); + } + else + info["load_factor"] = + static_cast(theApp->getFeeTrack().getLoadBase()) / theApp->getFeeTrack().getLoadFactor(); + + bool valid = false; + Ledger::pointer lpClosed = getValidatedLedger(); + if (lpClosed) + valid = true; + else + lpClosed = getClosedLedger(); - Ledger::pointer lpClosed = getClosedLedger(); if (lpClosed) { uint64 baseFee = lpClosed->getBaseFee(); uint64 baseRef = lpClosed->getReferenceFeeUnits(); Json::Value l(Json::objectValue); - l["seq"] = Json::UInt(lpClosed->getLedgerSeq()); - l["hash"] = lpClosed->getHash().GetHex(); - l["base_fee"] = static_cast(Json::UInt(baseFee)) / SYSTEM_CURRENCY_PARTS; - l["reserve_base"] = - static_cast(Json::UInt(lpClosed->getReserve(0) * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; - l["reserve_inc"] = - static_cast(Json::UInt(lpClosed->getReserveInc() * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; + l["seq"] = Json::UInt(lpClosed->getLedgerSeq()); + l["hash"] = lpClosed->getHash().GetHex(); + l["validated"] = valid; + if (!human) + { + l["base_fee"] = Json::Value::UInt(baseFee); + l["reserve_base"] = Json::Value::UInt(lpClosed->getReserve(0)); + l["reserve_inc"] = Json::Value::UInt(lpClosed->getReserveInc()); + l["close_time"] = Json::Value::UInt(lpClosed->getCloseTimeNC()); + } + else + { + l["base_fee_xrp"] = static_cast(Json::UInt(baseFee)) / SYSTEM_CURRENCY_PARTS; + l["reserve_base_xrp"] = + static_cast(Json::UInt(lpClosed->getReserve(0) * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; + l["reserve_inc_xrp"] = + static_cast(Json::UInt(lpClosed->getReserveInc() * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; + l["age"] = static_cast(lpClosed->getCloseTimeNC()) - getCloseTimeNC(); + } info["closed_ledger"] = l; } diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index ffaeb3873b..764dec4834 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -141,6 +141,7 @@ public: std::string strOperatingMode(); Ledger::ref getClosedLedger() { return mLedgerMaster->getClosedLedger(); } + Ledger::ref getValidatedLedger() { return mLedgerMaster->getValidatedLedger(); } Ledger::ref getCurrentLedger() { return mLedgerMaster->getCurrentLedger(); } Ledger::pointer getLedgerByHash(const uint256& hash) { return mLedgerMaster->getLedgerByHash(hash); } Ledger::pointer getLedgerBySeq(const uint32 seq) { return mLedgerMaster->getLedgerBySeq(seq); } @@ -243,7 +244,7 @@ public: int getPreviousConvergeTime() { return mLastCloseConvergeTime; } uint32 getLastCloseTime() { return mLastCloseTime; } void setLastCloseTime(uint32 t) { mLastCloseTime = t; } - Json::Value getServerInfo(bool admin); + Json::Value getServerInfo(bool human, bool admin); uint32 acceptLedger(); boost::unordered_map >& peekStoredProposals() { return mStoredProposals; } diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 5a41eb5f87..13138a3387 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1305,7 +1305,16 @@ Json::Value RPCHandler::doServerInfo(Json::Value) { Json::Value ret(Json::objectValue); - ret["info"] = theApp->getOPs().getServerInfo(mRole == ADMIN); + ret["info"] = theApp->getOPs().getServerInfo(true, mRole == ADMIN); + + return ret; +} + +Json::Value RPCHandler::doServerState(Json::Value) +{ + Json::Value ret(Json::objectValue); + + ret["info"] = theApp->getOPs().getServerInfo(false, mRole == ADMIN); return ret; } @@ -2589,7 +2598,8 @@ Json::Value RPCHandler::doCommand(Json::Value& jvRequest, int iRole) { "ripple_path_find", &RPCHandler::doRipplePathFind, false, optCurrent }, { "sign", &RPCHandler::doSign, false, optCurrent }, { "submit", &RPCHandler::doSubmit, false, optCurrent }, - { "server_info", &RPCHandler::doServerInfo, true, optNone }, + { "server_info", &RPCHandler::doServerInfo, false, optNone }, + { "server_state", &RPCHandler::doServerState, false, optNone }, { "stop", &RPCHandler::doStop, true, optNone }, { "transaction_entry", &RPCHandler::doTransactionEntry, false, optCurrent }, { "tx", &RPCHandler::doTx, false, optNetwork }, diff --git a/src/cpp/ripple/RPCHandler.h b/src/cpp/ripple/RPCHandler.h index a1d891700b..5c3365e014 100644 --- a/src/cpp/ripple/RPCHandler.h +++ b/src/cpp/ripple/RPCHandler.h @@ -66,7 +66,8 @@ class RPCHandler Json::Value doProfile(Json::Value params); Json::Value doRandom(Json::Value jvRequest); Json::Value doRipplePathFind(Json::Value jvRequest); - Json::Value doServerInfo(Json::Value params); + Json::Value doServerInfo(Json::Value params); // for humans + Json::Value doServerState(Json::Value params); // for machines Json::Value doSessionClose(Json::Value params); Json::Value doSessionOpen(Json::Value params); Json::Value doStop(Json::Value params); From 1af14e07c7c838324a5501276abf17d84ac3a272 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 15 Jan 2013 19:19:33 -0800 Subject: [PATCH 3/5] Tiny cosmetic tweak. --- src/cpp/ripple/RPCHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 13138a3387..2948b52e2e 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1314,7 +1314,7 @@ Json::Value RPCHandler::doServerState(Json::Value) { Json::Value ret(Json::objectValue); - ret["info"] = theApp->getOPs().getServerInfo(false, mRole == ADMIN); + ret["state"] = theApp->getOPs().getServerInfo(false, mRole == ADMIN); return ret; } From 1c48f6948d66d921d1daa9e7a60b0fb1bbe8fe57 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 15 Jan 2013 19:21:24 -0800 Subject: [PATCH 4/5] Fix "age". --- src/cpp/ripple/NetworkOPs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index e74374df99..89c0d02405 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1176,7 +1176,7 @@ Json::Value NetworkOPs::getServerInfo(bool human, bool admin) static_cast(Json::UInt(lpClosed->getReserve(0) * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; l["reserve_inc_xrp"] = static_cast(Json::UInt(lpClosed->getReserveInc() * baseFee / baseRef)) / SYSTEM_CURRENCY_PARTS; - l["age"] = static_cast(lpClosed->getCloseTimeNC()) - getCloseTimeNC(); + l["age"] = Json::UInt(getCloseTimeNC() - lpClosed->getCloseTimeNC()); } info["closed_ledger"] = l; } From 40e508540fecd654fa5ef427d56417bd361be58b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 15 Jan 2013 19:26:52 -0800 Subject: [PATCH 5/5] load_fee -> load_factor --- src/cpp/ripple/NetworkOPs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 89c0d02405..d907ad9637 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1008,7 +1008,7 @@ void NetworkOPs::pubServer() jvObj["type"] = "serverStatus"; jvObj["server_status"] = strOperatingMode(); jvObj["load_base"] = theApp->getFeeTrack().getLoadBase(); - jvObj["load_fee"] = theApp->getFeeTrack().getLoadFactor(); + jvObj["load_factor"] = theApp->getFeeTrack().getLoadFactor(); BOOST_FOREACH(InfoSub* ispListener, mSubServer) { @@ -1555,7 +1555,7 @@ bool NetworkOPs::subServer(InfoSub* ispListener, Json::Value& jvResult) jvResult["random"] = uRandom.ToString(); jvResult["server_status"] = strOperatingMode(); jvResult["load_base"] = theApp->getFeeTrack().getLoadBase(); - jvResult["load_fee"] = theApp->getFeeTrack().getLoadFactor(); + jvResult["load_factor"] = theApp->getFeeTrack().getLoadFactor(); return mSubServer.insert(ispListener).second; }