diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 8e2712c1bc..7876978c5a 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -150,17 +150,20 @@ void LedgerMaster::asyncAccept(Ledger::pointer ledger) resumeAcquiring(); } -void LedgerMaster::acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq) -{ +bool LedgerMaster::acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq) +{ // return: false = already gave up recently Ledger::pointer ledger = Ledger::loadByIndex(ledgerSeq); if (ledger && (ledger->getHash() == ledgerHash)) { cLog(lsDEBUG) << "Ledger found is database, doing async accept"; mTooFast = true; theApp->getJobQueue().addJob(jtPUBLEDGER, boost::bind(&LedgerMaster::asyncAccept, this, ledger)); - return; + return true; } + if (theApp->getMasterLedgerAcquire().isFailure(ledgerHash)) + return false; + mMissingLedger = theApp->getMasterLedgerAcquire().findCreate(ledgerHash); if (mMissingLedger->isComplete()) { @@ -168,16 +171,17 @@ void LedgerMaster::acquireMissingLedger(const uint256& ledgerHash, uint32 ledger if (lgr && (lgr->getLedgerSeq() == ledgerSeq)) missingAcquireComplete(mMissingLedger); mMissingLedger.reset(); - return; + return true; } else if (mMissingLedger->isDone()) { mMissingLedger.reset(); - return; + return false; } mMissingSeq = ledgerSeq; if (mMissingLedger->setAccept()) mMissingLedger->addOnComplete(boost::bind(&LedgerMaster::missingAcquireComplete, this, _1)); + return true; } void LedgerMaster::missingAcquireComplete(LedgerAcquire::pointer acq) diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 4785ecac15..162b06c8ad 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -51,7 +51,7 @@ protected: bool isValidTransaction(const Transaction::pointer& trans); bool isTransactionOnFutureList(const Transaction::pointer& trans); - void acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq); + bool acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq); void asyncAccept(Ledger::pointer); void missingAcquireComplete(LedgerAcquire::pointer); void pubThread();