diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 5a4c27341c..ce064fe47c 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -59,7 +59,8 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer) } else { - std::vector nodeIDs; std::vector nodeHashes; + std::vector nodeIDs; + std::vector nodeHashes; ConsensusTransSetSF sf; mMap->getMissingNodes(nodeIDs, nodeHashes, 256, &sf); if (nodeIDs.empty()) @@ -68,6 +69,8 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer) mComplete = true; else mFailed = true; + done(); + return; } else { @@ -77,12 +80,9 @@ void TransactionAcquire::trigger(Peer::ref peer, bool timer) for (std::vector::iterator it = nodeIDs.begin(); it != nodeIDs.end(); ++it) *(tmGL.add_nodeids()) = it->getRawString(); sendRequest(tmGL, peer); - return; } } - if (mComplete || mFailed) - done(); - else if (timer) + if (timer) resetTimer(); } @@ -128,7 +128,7 @@ bool TransactionAcquire::takeNodes(const std::list& nodeIDs, } void LCTransaction::setVote(const uint160& peer, bool votesYes) -{ +{ // Tracke a peer's yes/no vote on a particular disputed transaction std::pair::iterator, bool> res = mVotes.insert(std::make_pair(peer, votesYes)); @@ -162,7 +162,7 @@ void LCTransaction::setVote(const uint160& peer, bool votesYes) } void LCTransaction::unVote(const uint160& peer) -{ +{ // Remove a peer's vote on this disputed transasction boost::unordered_map::iterator it = mVotes.find(peer); if (it != mVotes.end()) { @@ -175,7 +175,7 @@ void LCTransaction::unVote(const uint160& peer) } bool LCTransaction::updatePosition(int percentTime, bool proposing) -{ // this many seconds after close, should our position change +{ if (mOurPosition && (mNays == 0)) return false; if (!mOurPosition && (mYays == 0)) @@ -247,29 +247,28 @@ void LedgerConsensus::checkLCL() uint256 netLgr = mPrevLedgerHash; int netLgrCount = 0; - uint256 favoredLedger = (mState == PRE_CLOSE) ? uint256() : mPrevLedgerHash; // Don't get stuck one ledger behind - boost::unordered_map vals = theApp->getValidations().getCurrentValidations(mPrevLedgerHash); + uint256 favoredLedger = (mState == lcsPRE_CLOSE) ? uint256() : mPrevLedgerHash; // Don't get stuck one ledger behind + boost::unordered_map vals = + theApp->getValidations().getCurrentValidations(favoredLedger); typedef std::pair u256_int_pair; BOOST_FOREACH(u256_int_pair& it, vals) - { if (it.second > netLgrCount) { netLgr = it.first; netLgrCount = it.second; } - } if (netLgr != mPrevLedgerHash) { // LCL change const char *status; switch (mState) { - case lcsPRE_CLOSE: status="PreClose"; break; - case lcsESTABLISH: status="Establish"; break; - case lcsFINISHED: status="Finised"; break; - case lcsACCEPTED: status="Accepted"; break; - default: status="unknown"; + case lcsPRE_CLOSE: status = "PreClose"; break; + case lcsESTABLISH: status = "Establish"; break; + case lcsFINISHED: status = "Finised"; break; + case lcsACCEPTED: status = "Accepted"; break; + default: status = "unknown"; } Log(lsWARNING) << "View of consensus changed during consensus (" << netLgrCount << ") status=" @@ -301,8 +300,10 @@ void LedgerConsensus::handleLCL(const uint256& lclHash) else { Log(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) { @@ -312,11 +313,13 @@ void LedgerConsensus::handleLCL(const uint256& lclHash) mAcquiringLedger->peerHas(peer); } } + if (!found) { BOOST_FOREACH(Peer::ref peer, peerList) mAcquiringLedger->peerHas(peer); } + if (mHaveCorrectLCL && mProposing && mOurPosition) { Log(lsINFO) << "Bowing out of consensus";