From f3725bdd2e286ff04d565d5b477b9accc5e00250 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 25 Feb 2015 18:38:51 -0800 Subject: [PATCH] Return a validated ledger if there is one (RIPD-814) LedgerMaster::getLedgerBySeq should return a validated ledger (rather than the the open or closed ledger) for a sequence number for which it has a fully-validated ledger. --- src/ripple/app/ledger/LedgerMaster.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/ripple/app/ledger/LedgerMaster.cpp b/src/ripple/app/ledger/LedgerMaster.cpp index b42c529c6..5476a4fa4 100644 --- a/src/ripple/app/ledger/LedgerMaster.cpp +++ b/src/ripple/app/ledger/LedgerMaster.cpp @@ -1448,6 +1448,28 @@ public: Ledger::pointer getLedgerBySeq (std::uint32_t index) { + if (index <= mValidLedgerSeq) + { + // Always prefer a validated ledger + auto valid = mValidLedger.get (); + if (valid) + { + if (valid->getLedgerSeq() == index) + return valid; + + try + { + uint256 const& hash = valid->getLedgerHash (index); + if (hash.isNonZero()) + return mLedgerHistory.getLedgerByHash (hash); + } + catch (...) + { + // Missing nodes are already handled + } + } + } + Ledger::pointer ret = mLedgerHistory.getLedgerBySeq (index); if (ret) return ret;