From a3241dae560797d59eee075687e70daf41d86ba7 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 5 Sep 2012 22:28:26 -0700 Subject: [PATCH] Fix a case where we could lose deferred prposals. --- src/LedgerConsensus.h | 4 ++++ src/NetworkOPs.cpp | 4 +++- src/NetworkOPs.h | 13 ++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index eef08c8807..4e1db172dd 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -181,6 +181,10 @@ public: bool peerGaveNodes(Peer::ref peer, const uint256& setHash, const std::list& nodeIDs, const std::list< std::vector >& nodeData); + + void swapDefer(boost::unordered_map< uint160, std::list > &n) + { mDeferredProposals.swap(n); } + }; diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 68127015f3..7706cd7ac9 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -613,6 +613,7 @@ int NetworkOPs::beginConsensus(const uint256& networkClosed, Ledger::pointer clo prevLedger->setImmutable(); mConsensus = boost::make_shared( networkClosed, prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC()); + mConsensus->swapDefer(mDeferredProposals); Log(lsDEBUG) << "Initiating consensus engine"; return mConsensus->startup(); @@ -665,7 +666,7 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash, cons } if (prevLedger.isNonZero()) - { // new-style + { // proposal includes a previous ledger LedgerProposal::pointer proposal = boost::make_shared(prevLedger, proposeSeq, proposeHash, closeTime, naPeerPublic); if (!proposal->checkSign(signature)) @@ -729,6 +730,7 @@ void NetworkOPs::endConsensus(bool correctLCL) Log(lsTRACE) << "Killing obsolete peer status"; it->cycleStatus(); } + mConsensus->swapDefer(mDeferredProposals); mConsensus = boost::shared_ptr(); } diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 25ac145f40..401d33baee 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -1,17 +1,18 @@ #ifndef __NETWORK_OPS__ #define __NETWORK_OPS__ +#include +#include +#include +#include + #include "AccountState.h" #include "LedgerMaster.h" #include "NicknameState.h" #include "RippleState.h" #include "SerializedValidation.h" #include "LedgerAcquire.h" - -#include -#include -#include -#include +#include "LedgerProposal.h" // Operations that clients may wish to perform against the network // Master operational handler, server sequencer, network tracker @@ -54,6 +55,8 @@ protected: boost::posix_time::ptime mConnectTime; boost::asio::deadline_timer mNetTimer; boost::shared_ptr mConsensus; + boost::unordered_map > mDeferredProposals; LedgerMaster* mLedgerMaster; LedgerAcquire::pointer mAcquiringLedger;