diff --git a/modules/ripple_app/ledger/LedgerMaster.cpp b/modules/ripple_app/ledger/LedgerMaster.cpp index 8938e43df..363926e46 100644 --- a/modules/ripple_app/ledger/LedgerMaster.cpp +++ b/modules/ripple_app/ledger/LedgerMaster.cpp @@ -560,11 +560,13 @@ void LedgerMaster::advanceThread() bool progress; + WriteLog (lsTRACE, LedgerMaster) << "advanceThread<"; + do { progress = false; - std::list pubLedgers = findNewLedgersToPublish(); + std::list pubLedgers = findNewLedgersToPublish (sl); if (pubLedgers.empty()) { if (!getConfig().RUN_STANDALONE && !getApp().getFeeTrack().isLoadedLocal() && @@ -576,6 +578,7 @@ void LedgerMaster::advanceThread() if ((missing != RangeSet::absent) && shouldAcquire(mValidLedger->getLedgerSeq(), getConfig().LEDGER_HISTORY, missing)) { + WriteLog (lsTRACE, LedgerMaster) << "advanceThread should acquire"; sl.unlock(); Ledger::pointer nextLedger = mLedgerHistory.getLedgerBySeq(missing + 1); if (nextLedger) @@ -657,10 +660,11 @@ void LedgerMaster::advanceThread() } while (progress); mAdvanceThread = false; + WriteLog (lsTRACE, LedgerMaster) << "advanceThread>"; } -std::list LedgerMaster::findNewLedgersToPublish() -{ // Call with a lock +std::list LedgerMaster::findNewLedgersToPublish(boost::recursive_mutex::scoped_lock& sl) +{ std::list ret; WriteLog (lsTRACE, LedgerMaster) << "findNewLedgersToPublish<"; @@ -678,24 +682,28 @@ std::list LedgerMaster::findNewLedgersToPublish() else if (mValidLedger->getLedgerSeq () > mPubLedger->getLedgerSeq ()) { int acqCount = 0; + uint32 pubSeq = mPubLedger->getLedgerSeq() + 1; // Next sequence to publish - for (uint32 seq = pubSeq; seq <= mValidLedger->getLedgerSeq (); ++seq) + uint32 valSeq = mValidLedger->getLedgerSeq(); + Ledger::pointer valLedger = mValidLedger; + + sl.unlock(); + for (uint32 seq = pubSeq; seq <= valSeq; ++seq) { WriteLog (lsTRACE, LedgerMaster) << "Trying to fetch/publish valid ledger " << seq; Ledger::pointer ledger; - uint256 hash = mValidLedger->getLedgerHash (seq); + uint256 hash = valLedger->getLedgerHash (seq); - if (seq == mValidLedger->getLedgerSeq ()) + if (seq == valSeq) { // We need to publish the ledger we just fully validated - ledger = mValidLedger; + ledger = valLedger; } else { if (hash.isZero ()) { - WriteLog (lsFATAL, LedgerMaster) << "Ledger: " << mValidLedger->getLedgerSeq () << " does not have hash for " << - seq; + WriteLog (lsFATAL, LedgerMaster) << "Ledger: " << valSeq << " does not have hash for " << seq; assert (false); } @@ -732,6 +740,7 @@ std::list LedgerMaster::findNewLedgersToPublish() } } + sl.lock(); } WriteLog (lsTRACE, LedgerMaster) << "findNewLedgersToPublish> " << ret.size(); diff --git a/modules/ripple_app/ledger/LedgerMaster.h b/modules/ripple_app/ledger/LedgerMaster.h index 94b726233..dd9cadb01 100644 --- a/modules/ripple_app/ledger/LedgerMaster.h +++ b/modules/ripple_app/ledger/LedgerMaster.h @@ -179,7 +179,7 @@ public: void checkAccept (uint256 const& hash); void checkAccept (uint256 const& hash, uint32 seq); - std::list findNewLedgersToPublish(); + std::list findNewLedgersToPublish(boost::recursive_mutex::scoped_lock& sl); void tryAdvance (); void newPathRequest ();