Fix some local acquire logic

This commit is contained in:
JoelKatz
2013-01-04 00:40:03 -08:00
parent 03ecbd1ea8
commit f0c73a76ce
2 changed files with 29 additions and 2 deletions

View File

@@ -132,8 +132,35 @@ bool LedgerMaster::haveLedgerRange(uint32 from, uint32 to)
return (prevMissing == RangeSet::RangeSetAbsent) || (prevMissing < from);
}
void LedgerMaster::asyncAccept(Ledger::pointer ledger)
{
do
{
{
boost::recursive_mutex::scoped_lock ml(mLock);
mCompleteLedgers.setValue(ledger->getLedgerSeq());
if ((ledger->getLedgerSeq() == 0) || mCompleteLedgers.hasValue(ledger->getLedgerSeq() - 1))
break;
}
Ledger::pointer prevLedger = Ledger::loadByIndex(ledger->getLedgerSeq() - 1);
if (!prevLedger || (prevLedger->getHash() != ledger->getParentHash()))
break;
ledger = prevLedger;
} while(1);
resumeAcquiring();
}
void LedgerMaster::acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq)
{
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;
}
mMissingLedger = theApp->getMasterLedgerAcquire().findCreate(ledgerHash);
if (mMissingLedger->isComplete())
{
@@ -294,10 +321,9 @@ void LedgerMaster::setFullLedger(Ledger::ref ledger)
cLog(lsDEBUG) << "no prior missing ledger";
return;
}
cLog(lsTRACE) << "Ledger " << prevMissing << " is missing";
if (shouldAcquire(mCurrentLedger->getLedgerSeq(), theConfig.LEDGER_HISTORY, prevMissing))
{
cLog(lsINFO) << "Ledger " << prevMissing << " is needed";
cLog(lsDEBUG) << "Ledger " << prevMissing << " is needed";
assert(!mCompleteLedgers.hasValue(prevMissing));
Ledger::pointer nextLedger = getLedgerBySeq(prevMissing + 1);
if (nextLedger)

View File

@@ -51,6 +51,7 @@ protected:
bool isTransactionOnFutureList(const Transaction::pointer& trans);
void acquireMissingLedger(const uint256& ledgerHash, uint32 ledgerSeq);
void asyncAccept(Ledger::pointer);
void missingAcquireComplete(LedgerAcquire::pointer);
void pubThread();