From 3e5ec9197797d0c257159532b54e3c12c82495da Mon Sep 17 00:00:00 2001 From: Miguel Portilla Date: Wed, 18 Nov 2015 08:44:42 -0500 Subject: [PATCH] Store index before publish (RIPD-1052, RIPD-1053) --- src/ripple/app/ledger/LedgerMaster.h | 2 +- src/ripple/app/ledger/impl/LedgerMaster.cpp | 36 ++++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/ripple/app/ledger/LedgerMaster.h b/src/ripple/app/ledger/LedgerMaster.h index 7a5dfed23..7745b3aa1 100644 --- a/src/ripple/app/ledger/LedgerMaster.h +++ b/src/ripple/app/ledger/LedgerMaster.h @@ -89,7 +89,7 @@ public: // This is the last ledger we published to clients and can lag the validated // ledger - virtual Ledger::ref getPublishedLedger () = 0; + virtual Ledger::pointer getPublishedLedger () = 0; virtual bool isValidLedger(LedgerInfo const&) = 0; diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index 1e30369ee..5b2a71382 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -423,6 +423,8 @@ public: // returns Ledgers we have all the nodes for bool getFullValidatedRange (std::uint32_t& minVal, std::uint32_t& maxVal) override { + // Validated ledger is likely not stored in the DB yet so we use the + // published ledger which is. maxVal = mPubLedgerSeq.load(); if (!maxVal) @@ -444,6 +446,8 @@ public: // Returns Ledgers we have all the nodes for and are indexed bool getValidatedRange (std::uint32_t& minVal, std::uint32_t& maxVal) override { + // Validated ledger is likely not stored in the DB yet so we use the + // published ledger which is. maxVal = mPubLedgerSeq.load(); if (!maxVal) @@ -1323,8 +1327,9 @@ public: // This is the last ledger we published to clients and can lag the validated // ledger. - Ledger::ref getPublishedLedger () override + Ledger::pointer getPublishedLedger () override { + ScopedLockType lock(m_mutex); return mPubLedger; } @@ -1703,20 +1708,31 @@ void LedgerMasterImp::doAdvance () << "tryAdvance acquired " << ledger->info().seq; setFullLedger(ledger, false, false); - mHistLedger = ledger; auto& parent = ledger->info().parentHash; - if (mFillInProgress == 0 && + + int fillInProgress; + { + ScopedLockType lock(m_mutex); + mHistLedger = ledger; + fillInProgress = mFillInProgress; + } + + if (fillInProgress == 0 && getHashByIndex(seq - 1, app_) == parent) { - // Previous ledger is in DB - ScopedLockType lock (m_mutex); - mFillInProgress = ledger->info().seq; + { + // Previous ledger is in DB + ScopedLockType lock(m_mutex); + mFillInProgress = ledger->info().seq; + } + app_.getJobQueue().addJob( jtADVANCE, "tryFill", [this, ledger] (Job& j) { tryFill(j, ledger); }); } + progress = true; } else @@ -1782,13 +1798,17 @@ void LedgerMasterImp::doAdvance () "tryAdvance publishing seq " << ledger->info().seq; setFullLedger(ledger, true, true); - app_.getOPs().pubLedger(ledger); } setPubLedger(ledger); - progress = true; + + { + ScopedUnlockType sul(m_mutex); + app_.getOPs().pubLedger(ledger); + } } + progress = true; app_.getOPs().clearNeedNetworkLedger(); newPFWork ("pf:newLedger"); }