From 194f61d4e24d0666f45f246a15e6081982a68756 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 15 Oct 2012 08:56:25 -0700 Subject: [PATCH] Hopefully a fix for the "stuck in neverending consensus" bug Jed reported. --- src/LedgerConsensus.cpp | 73 +++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 334fe883a..83dcbefef 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -300,37 +300,9 @@ void LedgerConsensus::checkLCL() void LedgerConsensus::handleLCL(const uint256& lclHash) { - mPrevLedgerHash = lclHash; - if (mPreviousLedger->getHash() == mPrevLedgerHash) - return; - - Ledger::pointer newLCL = theApp->getMasterLedger().getLedgerByHash(lclHash); - if (newLCL) - mPreviousLedger = newLCL; - else if (mAcquiringLedger && (mAcquiringLedger->getHash() == mPrevLedgerHash)) - return; - else - { - cLog(lsWARNING) << "Need consensus ledger " << mPrevLedgerHash; - - mAcquiringLedger = theApp->getMasterLedgerAcquire().findCreate(mPrevLedgerHash); - std::vector peerList = theApp->getConnectionPool().getPeerVector(); - - bool found = false; - BOOST_FOREACH(Peer::ref peer, peerList) - { - if (peer->hasLedger(mPrevLedgerHash)) - { - found = true; - mAcquiringLedger->peerHas(peer); - } - } - - if (!found) - { - BOOST_FOREACH(Peer::ref peer, peerList) - mAcquiringLedger->peerHas(peer); - } + if (mPrevLedgerHash != lclHash) + { // first time switching to this ledger + mPrevLedgerHash = lclHash; if (mHaveCorrectLCL && mProposing && mOurPosition) { @@ -338,15 +310,47 @@ void LedgerConsensus::handleLCL(const uint256& lclHash) mOurPosition->bowOut(); propose(); } - mHaveCorrectLCL = false; mProposing = false; mValidating = false; - mCloseTimes.clear(); mPeerPositions.clear(); + mPeerData.clear(); mDisputes.clear(); + mCloseTimes.clear(); mDeadNodes.clear(); playbackProposals(); - return; + } + + if (mPreviousLedger->getHash() != mPrevLedgerHash) + { // we need to switch the ledger we're working from + Ledger::pointer newLCL = theApp->getMasterLedger().getLedgerByHash(lclHash); + if (newLCL) + mPreviousLedger = newLCL; + else if (!mAcquiringLedger || (mAcquiringLedger->getHash() != mPrevLedgerHash)) + { // need to start acquiring the correct consensus LCL + cLog(lsWARNING) << "Need consensus ledger " << mPrevLedgerHash; + + mAcquiringLedger = theApp->getMasterLedgerAcquire().findCreate(mPrevLedgerHash); + std::vector peerList = theApp->getConnectionPool().getPeerVector(); + + bool found = false; + BOOST_FOREACH(Peer::ref peer, peerList) + { + if (peer->hasLedger(mPrevLedgerHash)) + { + found = true; + mAcquiringLedger->peerHas(peer); + } + } + + if (!found) + { + BOOST_FOREACH(Peer::ref peer, peerList) + mAcquiringLedger->peerHas(peer); + } + + mHaveCorrectLCL = false; + return; + } } cLog(lsINFO) << "Acquired the consensus ledger " << mPrevLedgerHash; @@ -355,7 +359,6 @@ void LedgerConsensus::handleLCL(const uint256& lclHash) mCloseResolution = ContinuousLedgerTiming::getNextLedgerTimeResolution( mPreviousLedger->getCloseResolution(), mPreviousLedger->getCloseAgree(), mPreviousLedger->getLedgerSeq() + 1); - playbackProposals(); } void LedgerConsensus::takeInitialPosition(Ledger& initialLedger)