From fd59422a22d83f10d2d9c4dca49be8d6ce6f1ffd Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 15 Sep 2013 13:29:52 -0700 Subject: [PATCH] Fixes to tryAdvance logic. --- src/ripple_app/ledger/LedgerMaster.cpp | 98 ++++++++++++++------------ src/ripple_app/misc/NetworkOPs.cpp | 11 ++- 2 files changed, 61 insertions(+), 48 deletions(-) diff --git a/src/ripple_app/ledger/LedgerMaster.cpp b/src/ripple_app/ledger/LedgerMaster.cpp index 2ece7c47f..9237e9d85 100644 --- a/src/ripple_app/ledger/LedgerMaster.cpp +++ b/src/ripple_app/ledger/LedgerMaster.cpp @@ -451,7 +451,7 @@ void LedgerMaster::setFullLedger (Ledger::pointer ledger, bool isSynchronous, bo ledger->setValidated(); mLedgerHistory.addLedger(ledger); - + ledger->setFull(); ScopedLockType ml (mLock, __FILE__, __LINE__); @@ -533,6 +533,7 @@ void LedgerMaster::checkAccept (Ledger::ref ledger) mLastValidateSeq = ledger->getLedgerSeq(); ledger->setValidated(); + ledger->setFull(); mValidLedger = ledger; if (!mPubLedger) { @@ -708,62 +709,69 @@ std::list LedgerMaster::findNewLedgersToPublish(ScopedLockType& Ledger::pointer valLedger = mValidLedger; sl.unlock(); - for (uint32 seq = pubSeq; seq <= valSeq; ++seq) + try { - WriteLog (lsTRACE, LedgerMaster) << "Trying to fetch/publish valid ledger " << seq; - - Ledger::pointer ledger; - uint256 hash = valLedger->getLedgerHash (seq); - - if (seq == valSeq) - { // We need to publish the ledger we just fully validated - ledger = valLedger; - } - else + for (uint32 seq = pubSeq; seq <= valSeq; ++seq) { - if (hash.isZero ()) - { - WriteLog (lsFATAL, LedgerMaster) << "Ledger: " << valSeq << " does not have hash for " << seq; - assert (false); - } + WriteLog (lsTRACE, LedgerMaster) << "Trying to fetch/publish valid ledger " << seq; - ledger = mLedgerHistory.getLedgerByHash (hash); - } + Ledger::pointer ledger; + uint256 hash = valLedger->getLedgerHash (seq); // This can throw - if (!ledger && (++acqCount < 4)) - { // We can try to acquire the ledger we need - InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq, false); - - if (!acq->isDone ()) - { - nothing (); - } - else if (acq->isComplete () && !acq->isFailed ()) - { - ledger = acq->getLedger(); + if (seq == valSeq) + { // We need to publish the ledger we just fully validated + ledger = valLedger; } else { - WriteLog (lsWARNING, LedgerMaster) << "Failed to acquire a published ledger"; - getApp().getInboundLedgers().dropLedger(hash); - acq = getApp().getInboundLedgers().findCreate(hash, seq, false); - if (acq->isComplete()) + if (hash.isZero ()) { - if (acq->isFailed()) - getApp().getInboundLedgers().dropLedger(hash); - else - ledger = acq->getLedger(); + WriteLog (lsFATAL, LedgerMaster) << "Ledger: " << valSeq << " does not have hash for " << seq; + assert (false); + } + + ledger = mLedgerHistory.getLedgerByHash (hash); + } + + if (!ledger && (++acqCount < 4)) + { // We can try to acquire the ledger we need + InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq, false); + + if (!acq->isDone ()) + { + nothing (); + } + else if (acq->isComplete () && !acq->isFailed ()) + { + ledger = acq->getLedger(); + } + else + { + WriteLog (lsWARNING, LedgerMaster) << "Failed to acquire a published ledger"; + getApp().getInboundLedgers().dropLedger(hash); + acq = getApp().getInboundLedgers().findCreate(hash, seq, false); + if (acq->isComplete()) + { + if (acq->isFailed()) + getApp().getInboundLedgers().dropLedger(hash); + else + ledger = acq->getLedger(); + } } } - } - if (ledger && (ledger->getLedgerSeq() == pubSeq)) - { // We acquired the next ledger we need to publish - ledger->setValidated(); - ret.push_back (ledger); - ++pubSeq; - } + if (ledger && (ledger->getLedgerSeq() == pubSeq)) + { // We acquired the next ledger we need to publish + ledger->setValidated(); + ret.push_back (ledger); + ++pubSeq; + } + } + } + catch (...) + { + WriteLog (lsERROR, LedgerMaster) << "findNewLedgersToPublish catches an exception"; } sl.lock(__FILE__, __LINE__); } diff --git a/src/ripple_app/misc/NetworkOPs.cpp b/src/ripple_app/misc/NetworkOPs.cpp index f93793d80..0a79dd6ca 100644 --- a/src/ripple_app/misc/NetworkOPs.cpp +++ b/src/ripple_app/misc/NetworkOPs.cpp @@ -3045,11 +3045,16 @@ void NetworkOPsImp::gotFetchPack (bool progress, uint32 seq) void NetworkOPsImp::missingNodeInLedger (uint32 seq) { - WriteLog (lsWARNING, NetworkOPs) << "We are missing a node in ledger " << seq; uint256 hash = getApp().getLedgerMaster ().getHashBySeq (seq); - - if (hash.isNonZero ()) + if (hash.isZero()) + { + WriteLog (lsWARNING, NetworkOPs) << "Missing a node in ledger " << seq << " cannot fetch"; + } + else + { + WriteLog (lsWARNING, NetworkOPs) << "Missing a node in ledger " << seq << " fetching"; getApp().getInboundLedgers ().findCreate (hash, seq, false); + } } //------------------------------------------------------------------------------