From 338fa903872cf050354fd108cb081a2bb8729819 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 12 Jul 2012 23:07:55 -0700 Subject: [PATCH] Correctly sequence to acquiring a new LCL if it changes. Don't keep acquiring the old one. --- src/LedgerAcquire.cpp | 4 +++- src/LedgerAcquire.h | 3 ++- src/NetworkOPs.cpp | 20 ++++++++++++++------ src/NetworkOPs.h | 2 ++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index ffd82a7f83..f94536ea5f 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -84,7 +84,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) + mHaveBase(false), mHaveState(false), mHaveTransactions(false), mAborted(false) { #ifdef LA_DEBUG Log(lsTRACE) << "Acquiring ledger " << mHash.GetHex(); @@ -122,6 +122,8 @@ void LedgerAcquire::addOnComplete(boost::function void LedgerAcquire::trigger(Peer::pointer peer) { + if (mAborted) + return; #ifdef LA_DEBUG if(peer) Log(lsTRACE) << "Trigger acquiring ledger " << mHash.GetHex() << " from " << peer->getIP(); else Log(lsTRACE) << "Trigger acquiring ledger " << mHash.GetHex(); diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index ba96139372..62540172b3 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -65,7 +65,7 @@ public: protected: Ledger::pointer mLedger; - bool mHaveBase, mHaveState, mHaveTransactions; + bool mHaveBase, mHaveState, mHaveTransactions, mAborted; std::vector< boost::function > mOnComplete; @@ -83,6 +83,7 @@ public: bool isAcctStComplete() const { return mHaveState; } bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } + void abort() { mAborted = true; } void addOnComplete(boost::function); diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index b3f2daf3b3..69a6ec49a0 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -401,7 +401,15 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis networkClosed = closedLedger; if (!switchLedgers) + { + if (mAcquiringLedger) + { + mAcquiringLedger->abort(); + theApp->getMasterLedgerAcquire().dropLedger(mAcquiringLedger->getHash()); + mAcquiringLedger = LedgerAcquire::pointer(); + } return false; + } Log(lsWARNING) << "We are not running on the consensus ledger"; Log(lsINFO) << "Our LCL " << ourClosed->getHash().GetHex(); @@ -412,14 +420,14 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis if (!consensus) { Log(lsINFO) << "Acquiring consensus ledger"; - LedgerAcquire::pointer acq = theApp->getMasterLedgerAcquire().findCreate(closedLedger); - if (!acq || acq->isFailed()) + LedgerAcquire::pointer mAcquiringLedger = theApp->getMasterLedgerAcquire().findCreate(closedLedger); + if (!mAcquiringLedger || mAcquiringLedger->isFailed()) { theApp->getMasterLedgerAcquire().dropLedger(closedLedger); Log(lsERROR) << "Network ledger cannot be acquired"; return true; } - if (!acq->isComplete()) + if (!mAcquiringLedger->isComplete()) { // add more peers int count = 0; std::vector peers=theApp->getConnectionPool().getPeerVector(); @@ -429,7 +437,7 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis if ((*it)->getClosedLedgerHash() == closedLedger) { ++count; - acq->peerHas(*it); + mAcquiringLedger->peerHas(*it); } } if (!count) @@ -438,12 +446,12 @@ bool NetworkOPs::checkLastClosedLedger(const std::vector& peerLis it != end; ++it) { if ((*it)->isConnected()) - acq->peerHas(*it); + mAcquiringLedger->peerHas(*it); } } return true; } - consensus = acq->getLedger(); + consensus = mAcquiringLedger->getLedger(); } // FIXME: If this rewinds the ledger sequence, or has the same sequence, we should update the status on diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index f2950f6732..3a1387460a 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -6,6 +6,7 @@ #include "NicknameState.h" #include "RippleState.h" #include "SerializedValidation.h" +#include "LedgerAcquire.h" #include #include @@ -51,6 +52,7 @@ protected: boost::shared_ptr mConsensus; LedgerMaster* mLedgerMaster; + LedgerAcquire::pointer mAcquiringLedger; void setMode(OperatingMode);