From a8552ec4f68aa4adaf2ba4ca677c1a409de80fb0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 01:19:49 -0700 Subject: [PATCH] Fix a ledger acquire race that caused a crash. --- src/cpp/ripple/LedgerAcquire.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 1a299fbe88..6d04733078 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -281,6 +281,7 @@ bool LedgerAcquire::addOnComplete(boost::function void LedgerAcquire::trigger(Peer::ref peer) { + boost::recursive_mutex::scoped_lock sl(mLock); if (mAborted || mComplete || mFailed) { cLog(lsTRACE) << "Trigger on ledger:" << @@ -585,7 +586,8 @@ bool LedgerAcquire::takeBase(const std::string& data) // data must not have hash cLog(lsTRACE) << "got base acquiring ledger " << mHash; #endif boost::recursive_mutex::scoped_lock sl(mLock); - if (mHaveBase) return true; + if (mHaveBase) + return true; mLedger = boost::make_shared(data, false); if (mLedger->getHash() != mHash) { @@ -616,8 +618,11 @@ bool LedgerAcquire::takeBase(const std::string& data) // data must not have hash bool LedgerAcquire::takeTxNode(const std::list& nodeIDs, const std::list< std::vector >& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; + if (mHaveTransactions) + return true; std::list::const_iterator nodeIDit = nodeIDs.begin(); std::list< std::vector >::const_iterator nodeDatait = data.begin(); @@ -657,11 +662,14 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, cLog(lsTRACE) << "got ASdata (" << nodeIDs.size() <<") acquiring ledger " << mHash; tLog(nodeIDs.size() == 1, lsTRACE) << "got AS node: " << nodeIDs.front(); + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) { cLog(lsWARNING) << "Don't have ledger base"; return false; } + if (mHaveState) + return true; std::list::const_iterator nodeIDit = nodeIDs.begin(); std::list< std::vector >::const_iterator nodeDatait = data.begin(); @@ -700,6 +708,7 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, bool LedgerAcquire::takeAsRootNode(const std::vector& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; AccountStateSF tFilter(mLedger->getLedgerSeq()); @@ -709,6 +718,7 @@ bool LedgerAcquire::takeAsRootNode(const std::vector& data, SMAdd bool LedgerAcquire::takeTxRootNode(const std::vector& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; TransactionStateSF tFilter(mLedger->getLedgerSeq());