From 0ac4185ff95f9a211d846ac553a3dcfdd1384008 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 24 Oct 2012 07:26:05 -0700 Subject: [PATCH] Update to support accepting ledgers acquired during the history fill. --- src/Ledger.cpp | 5 ++++- src/Ledger.h | 2 +- src/LedgerAcquire.cpp | 13 +++++++++++-- src/LedgerAcquire.h | 3 ++- src/LedgerHistory.cpp | 4 ++-- src/LedgerHistory.h | 2 +- src/LedgerMaster.cpp | 4 +++- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/Ledger.cpp b/src/Ledger.cpp index 4460e2747d..c93b905323 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -337,7 +337,7 @@ uint256 Ledger::getHash() return mHash; } -void Ledger::saveAcceptedLedger() +void Ledger::saveAcceptedLedger(bool fromConsensus) { // can be called in a different thread static boost::format ledgerExists("SELECT LedgerSeq FROM Ledgers where LedgerSeq = %d;"); static boost::format deleteLedger("DELETE FROM Ledgers WHERE LedgerSeq = %d;"); @@ -428,6 +428,9 @@ void Ledger::saveAcceptedLedger() mAccountHash.GetHex() % mTransHash.GetHex())); } + if (!fromConsensus) + return; + theApp->getOPs().pubLedger(shared_from_this()); if(theConfig.FULL_HISTORY) diff --git a/src/Ledger.h b/src/Ledger.h index 7c746843aa..ca6b9ed2b3 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -157,7 +157,7 @@ public: SLE::pointer getAccountRoot(const NewcoinAddress& naAccountID); // database functions - void saveAcceptedLedger(); + void saveAcceptedLedger(bool fromConsensus); static Ledger::pointer loadByIndex(uint32 ledgerIndex); static Ledger::pointer loadByHash(const uint256& ledgerHash); diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 0ebb7c4704..9cc09b2ee5 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -91,7 +91,7 @@ void PeerSet::TimerEntry(boost::weak_ptr wptr, const boost::system::err } LedgerAcquire::LedgerAcquire(const uint256& hash) : PeerSet(hash, LEDGER_ACQUIRE_TIMEOUT), - mHaveBase(false), mHaveState(false), mHaveTransactions(false), mAborted(false), mSignaled(false) + mHaveBase(false), mHaveState(false), mHaveTransactions(false), mAborted(false), mSignaled(false), mAccept(false) { #ifdef LA_DEBUG cLog(lsTRACE) << "Acquiring ledger " << mHash; @@ -169,7 +169,11 @@ void LedgerAcquire::done() mLock.unlock(); if (mLedger) + { + if (mAccept) + mLedger->setAccepted(); theApp->getMasterLedger().storeLedger(mLedger); + } for (unsigned int i = 0; i < triggers.size(); ++i) triggers[i](shared_from_this()); @@ -619,6 +623,7 @@ void LedgerAcquireSet::updateCurrentLedger(Ledger::pointer currentLedger) { // the next ledger we need is missing or missing nodes LedgerAcquire::pointer nextAcquire = theApp->getMasterLedgerAcquire().findCreate(currentLedger->getParentHash()); + nextAcquire->setAccept(); if (mCurrentLedger) nextAcquire->takePeerSetFrom(*mCurrentLedger); mCurrentLedger = nextAcquire; @@ -639,7 +644,11 @@ void LedgerAcquireSet::onComplete(boost::weak_ptr set, LedgerA return; if (acquired->isComplete()) - lSet->updateCurrentLedger(acquired->getLedger()); + { + Ledger::pointer ledger = acquired->getLedger(); + ledger->setAccepted(); + lSet->updateCurrentLedger(ledger); + } else { cLog(lsWARNING) << "Bailing on LedgerAcquireSet due to failure to acquire a ledger"; diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index a07dbccd8c..cbd0459dc3 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -68,7 +68,7 @@ public: protected: Ledger::pointer mLedger; - bool mHaveBase, mHaveState, mHaveTransactions, mAborted, mSignaled; + bool mHaveBase, mHaveState, mHaveTransactions, mAborted, mSignaled, mAccept; std::vector< boost::function > mOnComplete; @@ -88,6 +88,7 @@ public: bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } void abort() { mAborted = true; } + void setAccept() { mAccept = true; } void addOnComplete(boost::function); diff --git a/src/LedgerHistory.cpp b/src/LedgerHistory.cpp index 75519538a2..233ab30787 100644 --- a/src/LedgerHistory.cpp +++ b/src/LedgerHistory.cpp @@ -26,7 +26,7 @@ void LedgerHistory::addLedger(Ledger::pointer ledger) mLedgersByHash.canonicalize(ledger->getHash(), ledger, true); } -void LedgerHistory::addAcceptedLedger(Ledger::pointer ledger) +void LedgerHistory::addAcceptedLedger(Ledger::pointer ledger, bool fromConsensus) { assert(ledger && ledger->isAccepted()); uint256 h(ledger->getHash()); @@ -37,7 +37,7 @@ void LedgerHistory::addAcceptedLedger(Ledger::pointer ledger) assert(ledger->isImmutable()); mLedgersByIndex.insert(std::make_pair(ledger->getLedgerSeq(), ledger)); - boost::thread thread(boost::bind(&Ledger::saveAcceptedLedger, ledger)); + boost::thread thread(boost::bind(&Ledger::saveAcceptedLedger, ledger, fromConsensus)); thread.detach(); } diff --git a/src/LedgerHistory.h b/src/LedgerHistory.h index e593c739b1..ed58f4fc98 100644 --- a/src/LedgerHistory.h +++ b/src/LedgerHistory.h @@ -13,7 +13,7 @@ public: LedgerHistory(); void addLedger(Ledger::pointer ledger); - void addAcceptedLedger(Ledger::pointer ledger); + void addAcceptedLedger(Ledger::pointer ledger, bool fromConsensus); Ledger::pointer getLedgerBySeq(uint32 index); Ledger::pointer getLedgerByHash(const uint256& hash); diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 5553c91b57..773e98dbed 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -45,7 +45,7 @@ void LedgerMaster::pushLedger(Ledger::ref newLCL, Ledger::ref newOL) { assert(newLCL->isClosed()); assert(newLCL->isImmutable()); - mLedgerHistory.addAcceptedLedger(newLCL); + mLedgerHistory.addAcceptedLedger(newLCL, false); if (mLastFullLedger && (newLCL->getParentHash() == mLastFullLedger->getHash())) mLastFullLedger = newLCL; Log(lsINFO) << "StashAccepted: " << newLCL->getHash(); @@ -72,6 +72,8 @@ void LedgerMaster::switchLedgers(Ledger::ref lastClosed, Ledger::ref current) void LedgerMaster::storeLedger(Ledger::ref ledger) { mLedgerHistory.addLedger(ledger); + if (ledger->isAccepted()) + mLedgerHistory.addAcceptedLedger(ledger, false); }