From dd65bd8a721c2294c2326207c3e7d82b20bdb958 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 10 Jul 2013 11:17:22 -0700 Subject: [PATCH] Be smarter about how we acquire ledgers we need to publish. --- src/cpp/ripple/LedgerMaster.cpp | 46 ++++++++++++++------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 440772f99..8b8cb7d8b 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -684,6 +684,7 @@ void LedgerMaster::tryPublish () } else if (mValidLedger->getLedgerSeq () > mPubLedger->getLedgerSeq ()) { + int acq = 0; for (uint32 seq = mPubLedger->getLedgerSeq () + 1; seq <= mValidLedger->getLedgerSeq (); ++seq) { WriteLog (lsTRACE, LedgerMaster) << "Trying to publish ledger " << seq; @@ -692,7 +693,7 @@ void LedgerMaster::tryPublish () uint256 hash; if (seq == mValidLedger->getLedgerSeq ()) - { + { // We need to publish the ledger we just fully validated ledger = mValidLedger; hash = ledger->getHash (); } @@ -710,35 +711,28 @@ void LedgerMaster::tryPublish () ledger = mLedgerHistory.getLedgerByHash (hash); } - if (ledger) - { - mPubLedger = ledger; - mPubLedgers.push_back (ledger); - } - else - { - if (getApp().getInboundLedgers ().isFailure (hash)) + if (!ledger && (++acq < 4)) + { // We can try to acquire the ledger we need + InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq); + + if (!acq->isDone ()) { - WriteLog (lsWARNING, LedgerMaster) << "Unable to acquire a recent validated ledger"; + acq->setAccept (); + } + else if (acq->isComplete () && !acq->isFailed ()) + { + ledger = acq->getLedger(); } else - { - InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq); - - if (!acq->isDone ()) - { - acq->setAccept (); - break; - } - else if (acq->isComplete () && !acq->isFailed ()) - { - mPubLedger = acq->getLedger (); - mPubLedgers.push_back (mPubLedger); - } - else - WriteLog (lsWARNING, LedgerMaster) << "Failed to acquire a published ledger"; - } + WriteLog (lsWARNING, LedgerMaster) << "Failed to acquire a published ledger"; } + + if (ledger && (ledger->getLedgerSeq() == (mPubLedger->getLedgerSeq() + 1))) + { // We acquired the next ledger we need to publish + mPubLedger = ledger; + mPubLedgers.push_back (mPubLedger); + } + } }