diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index cd52f306db..c7c1036aa6 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -23,6 +23,23 @@ Ledger::ref LedgerMaster::getCurrentSnapshot () return mCurrentSnapshot; } +int LedgerMaster::getPublishedLedgerAge () +{ + boost::recursive_mutex::scoped_lock ml (mLock); + if (!mPubLedger) + { + WriteLog (lsDEBUG, LedgerMaster) << "No published ledger"; + return 999999; + } + + int64 ret = getApp().getOPs ().getCloseTimeNC (); + ret -= static_cast (mPubLedger->getCloseTimeNC ()); + ret = std::max (0LL, ret); + + WriteLog (lsTRACE, LedgerMaster) << "Published ledger age is " << ret; + return static_cast (ret); +} + int LedgerMaster::getValidatedLedgerAge () { boost::recursive_mutex::scoped_lock ml (mLock); @@ -42,7 +59,7 @@ int LedgerMaster::getValidatedLedgerAge () bool LedgerMaster::isCaughtUp(std::string& reason) { - if (getValidatedLedgerAge() > 180) + if (getPublishedLedgerAge() > 180) { reason = "No recently-validated ledger"; return false; @@ -138,6 +155,8 @@ void LedgerMaster::storeLedger (Ledger::pointer ledger) if (ledger->isAccepted ()) mLedgerHistory.addAcceptedLedger (ledger, false); + + checkAccept (ledger->getHash(), ledger->getLedgerSeq()); } Ledger::pointer LedgerMaster::closeLedger (bool recover) diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 4df10d0eb7..d000566ae5 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -58,11 +58,19 @@ public: return mFinalizedLedger; } - // The published ledger is the last fully validated ledger + // The validated ledger is the last fully validated ledger Ledger::ref getValidatedLedger () + { + return mValidLedger; + } + + // This is the last ledger we published to clients and can lag the validated ledger + Ledger::ref getPublishedLedger () { return mPubLedger; } + + int getPublishedLedgerAge (); int getValidatedLedgerAge (); bool isCaughtUp(std::string& reason); diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 30910e4396..13694d7180 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1509,6 +1509,12 @@ Json::Value NetworkOPs::getServerInfo (bool human, bool admin) info["validated_ledger"] = l; else info["closed_ledger"] = l; + + Ledger::pointer lpPublished = getPublishedLedger (); + if (!lpPublished) + info["published_ledger"] = "none"; + else if (lpPublished->getLedgerSeq() != lpClosed->getLedgerSeq()) + info["published_ledger"] = lpPublished->getLedgerSeq(); } return info; @@ -2375,7 +2381,7 @@ void NetworkOPs::doClusterReport () node.set_reporttime(it->second.getReportTime()); node.set_nodeload(it->second.getLoadFee()); if (!it->second.getName().empty()) - node.set_nodename(it->second.getName()); + node.set_nodename(it->second.getName()); } PackedMessage::pointer message = boost::make_shared(cluster, protocol::mtCLUSTER); diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index 0bb74cf30a..d2797f7471 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -80,6 +80,10 @@ public: { return mLedgerMaster->getValidatedLedger (); } + Ledger::ref getPublishedLedger () + { + return mLedgerMaster->getPublishedLedger (); + } Ledger::ref getCurrentLedger () { return mLedgerMaster->getCurrentLedger ();