diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index de1a90a8bd..7cfff58c15 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -25,6 +25,7 @@ Ledger::ref LedgerMaster::getCurrentSnapshot () int LedgerMaster::getValidatedLedgerAge () { + boost::recursive_mutex::scoped_lock ml (mLock); if (!mValidLedger) { WriteLog (lsDEBUG, LedgerMaster) << "No validated ledger"; @@ -39,6 +40,27 @@ int LedgerMaster::getValidatedLedgerAge () return static_cast (ret); } +bool LedgerMaster::isCaughtUp(std::string& reason) +{ + if (getValidatedLedgerAge() > 180) + { + reason = "No recently-validated ledger"; + return false; + } + boost::recursive_mutex::scoped_lock ml (mLock); + if (!mValidLedger || !mPubLedger) + { + reason = "No published ledger"; + return false; + } + if (mValidLedger->getLedgerSeq() > (mPubLedger->getLedgerSeq() + 3)) + { + reason = "Published ledger lags validated ledger"; + return false; + } + return true; +} + void LedgerMaster::addHeldTransaction (Transaction::ref transaction) { // returns true if transaction was added diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 330a2c8d50..45b7913aa7 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -60,6 +60,7 @@ public: return mPubLedger; } int getValidatedLedgerAge (); + bool isCaughtUp(std::string& reason); TER doTransaction (SerializedTransaction::ref txn, TransactionEngineParams params, bool& didApply); diff --git a/src/cpp/ripple/ripple_Application.cpp b/src/cpp/ripple/ripple_Application.cpp index 49cbeecd04..dbce6a46c8 100644 --- a/src/cpp/ripple/ripple_Application.cpp +++ b/src/cpp/ripple/ripple_Application.cpp @@ -829,6 +829,9 @@ bool serverOkay (std::string& reason) return false; } + if (!theApp->getLedgerMaster().isCaughtUp(reason)) + return false; + if (theApp->getFeeTrack ().isLoaded ()) { reason = "Too much load"; diff --git a/src/cpp/ripple/ripple_LoadManager.cpp b/src/cpp/ripple/ripple_LoadManager.cpp index 5d071f7234..4488e44585 100644 --- a/src/cpp/ripple/ripple_LoadManager.cpp +++ b/src/cpp/ripple/ripple_LoadManager.cpp @@ -201,6 +201,8 @@ private: // We do it this way in case we want to add exponential decay later int now = UptimeTimer::getInstance ().getElapsedSeconds (); + + boost::mutex::scoped_lock sl (mLock); canonicalize (source, now); source.mBalance += credits;