From 20f898c37e998b40a8b6f8413c2c58fc39f4d41a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Aug 2013 22:50:39 -0700 Subject: [PATCH] Separately track the next sequence to publish in findNewLedgersToPublish --- modules/ripple_app/ledger/LedgerMaster.cpp | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/modules/ripple_app/ledger/LedgerMaster.cpp b/modules/ripple_app/ledger/LedgerMaster.cpp index 2bc576ffc5..24dfc22ae1 100644 --- a/modules/ripple_app/ledger/LedgerMaster.cpp +++ b/modules/ripple_app/ledger/LedgerMaster.cpp @@ -572,6 +572,7 @@ void LedgerMaster::advanceThread() (mValidLedger->getLedgerSeq() == mPubLedger->getLedgerSeq())) { // We are in sync, so can acquire uint32 missing = mCompleteLedgers.prevMissing(mPubLedger->getLedgerSeq()); + WriteLog (lsTRACE, LedgerMaster) << "tryAdvance discovered missing " << missing; if ((missing != RangeSet::absent) && shouldAcquire(mValidLedger->getLedgerSeq(), getConfig().LEDGER_HISTORY, missing)) { @@ -579,6 +580,7 @@ void LedgerMaster::advanceThread() Ledger::pointer nextLedger = mLedgerHistory.getLedgerBySeq(missing + 1); if (nextLedger) { + assert (nextLedger->getLedgerSeq() == (missing + 1)); Ledger::pointer ledger = getLedgerByHash(nextLedger->getParentHash()); if (!ledger) { @@ -590,11 +592,17 @@ void LedgerMaster::advanceThread() if (acq && acq->isComplete() && !acq->isFailed()) ledger = acq->getLedger(); else if ((missing > 40000) && getApp().getOPs().shouldFetchPack(missing)) + { + WriteLog (lsTRACE, LedgerMaster) << "tryAdvance want fetch pack " << missing; getFetchPack(nextLedger); + } } + else + WriteLog (lsDEBUG, LedgerMaster) << "tryAdvance found failed acquire"; } if (ledger) { + WriteLog (lsTRACE, LedgerMaster) << "tryAdvance acquired " << ledger->getLedgerSeq(); setFullLedger(ledger, false, false); tryFill(ledger); progress = true; @@ -608,19 +616,22 @@ void LedgerMaster::advanceThread() } sl.lock(); if (mValidLedger->getLedgerSeq() != mPubLedger->getLedgerSeq()) + { + WriteLog (lsDEBUG, LedgerMaster) << "tryAdvance found last valid changed"; progress = true; + } } } else - WriteLog (lsTRACE, LedgerMaster) << "Not fetching history"; + WriteLog (lsTRACE, LedgerMaster) << "tryAdvance not fetching history"; } else { - WriteLog (lsTRACE, LedgerMaster) << "Found " << pubLedgers.size() << " ledgers to publish"; + WriteLog (lsTRACE, LedgerMaster) << "tryAdvance found " << pubLedgers.size() << " ledgers to publish"; BOOST_FOREACH(Ledger::ref ledger, pubLedgers) { sl.unlock(); - WriteLog(lsDEBUG, LedgerMaster) << "Publishing seq " << ledger->getLedgerSeq(); + WriteLog(lsDEBUG, LedgerMaster) << "tryAdvance publishing seq " << ledger->getLedgerSeq(); setFullLedger(ledger, true, true); getApp().getOPs().pubLedger(ledger); @@ -649,6 +660,7 @@ std::list LedgerMaster::findNewLedgersToPublish() { // Call with a lock std::list ret; + WriteLog (lsTRACE, LedgerMaster) << "findNewLedgersToPublish<"; if (!mPubLedger) { WriteLog (lsINFO, LedgerMaster) << "First published ledger will be " << mValidLedger->getLedgerSeq(); @@ -663,9 +675,10 @@ std::list LedgerMaster::findNewLedgersToPublish() else if (mValidLedger->getLedgerSeq () > mPubLedger->getLedgerSeq ()) { int acqCount = 0; - for (uint32 seq = mPubLedger->getLedgerSeq () + 1; seq <= mValidLedger->getLedgerSeq (); ++seq) + uint32 pubSeq = mPubLedger->getLedgerSeq() + 1; // Next sequence to publish + for (uint32 seq = pubSeq; seq <= mValidLedger->getLedgerSeq (); ++seq) { - WriteLog (lsTRACE, LedgerMaster) << "Trying to publish ledger " << seq; + WriteLog (lsTRACE, LedgerMaster) << "Trying to fetch/publish valid ledger " << seq; Ledger::pointer ledger; uint256 hash = mValidLedger->getLedgerHash (seq); @@ -708,15 +721,17 @@ std::list LedgerMaster::findNewLedgersToPublish() } } - if (ledger && (ledger->getLedgerSeq() == (mPubLedger->getLedgerSeq() + 1))) + if (ledger && (ledger->getLedgerSeq() == pubSeq)) { // We acquired the next ledger we need to publish ledger->setValidated(); ret.push_back (ledger); + ++pubSeq; } } } + WriteLog (lsTRACE, LedgerMaster) << "findNewLedgersToPublish> " << ret.size(); return ret; }