diff --git a/modules/ripple_app/ledger/ripple_InboundLedger.cpp b/modules/ripple_app/ledger/ripple_InboundLedger.cpp index 510c16624c..5ba76f67c2 100644 --- a/modules/ripple_app/ledger/ripple_InboundLedger.cpp +++ b/modules/ripple_app/ledger/ripple_InboundLedger.cpp @@ -138,7 +138,7 @@ bool InboundLedger::tryLocal () return mComplete; } -void InboundLedger::onTimer (bool progress) +void InboundLedger::onTimer (bool progress, boost::recursive_mutex::scoped_lock&) { mRecentTXNodes.clear (); mRecentASNodes.clear (); diff --git a/modules/ripple_app/ledger/ripple_InboundLedger.h b/modules/ripple_app/ledger/ripple_InboundLedger.h index 3988b51be8..d994252869 100644 --- a/modules/ripple_app/ledger/ripple_InboundLedger.h +++ b/modules/ripple_app/ledger/ripple_InboundLedger.h @@ -92,7 +92,7 @@ public: private: void done (); - void onTimer (bool progress); + void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock); void newPeer (Peer::ref peer) { diff --git a/src/cpp/ripple/ripple_PeerSet.cpp b/src/cpp/ripple/ripple_PeerSet.cpp index 6698e55b1e..de58e4bfa4 100644 --- a/src/cpp/ripple/ripple_PeerSet.cpp +++ b/src/cpp/ripple/ripple_PeerSet.cpp @@ -54,12 +54,12 @@ void PeerSet::invokeOnTimer () { ++mTimeouts; WriteLog (lsWARNING, InboundLedger) << "Timeout(" << mTimeouts << ") pc=" << mPeers.size () << " acquiring " << mHash; - onTimer (false); + onTimer (false, sl); } else { mProgress = false; - onTimer (true); + onTimer (true, sl); } if (!isDone ()) diff --git a/src/cpp/ripple/ripple_PeerSet.h b/src/cpp/ripple/ripple_PeerSet.h index c0fd81bdb4..b61336fb2f 100644 --- a/src/cpp/ripple/ripple_PeerSet.h +++ b/src/cpp/ripple/ripple_PeerSet.h @@ -71,7 +71,7 @@ protected: virtual ~PeerSet () { } virtual void newPeer (Peer::ref) = 0; - virtual void onTimer (bool progress) = 0; + virtual void onTimer (bool progress, boost::recursive_mutex::scoped_lock&) = 0; virtual boost::weak_ptr pmDowncast () = 0; void setComplete () diff --git a/src/cpp/ripple/ripple_TransactionAcquire.cpp b/src/cpp/ripple/ripple_TransactionAcquire.cpp index adb4e4fc1a..26af9f9785 100644 --- a/src/cpp/ripple/ripple_TransactionAcquire.cpp +++ b/src/cpp/ripple/ripple_TransactionAcquire.cpp @@ -44,22 +44,26 @@ void TransactionAcquire::done () getApp().getIOService ().post (BIND_TYPE (&TACompletionHandler, mHash, map)); } -void TransactionAcquire::onTimer (bool progress) +void TransactionAcquire::onTimer (bool progress, boost::recursive_mutex::scoped_lock& psl) { bool aggressive = false; if (getTimeouts () > 10) { WriteLog (lsWARNING, TransactionAcquire) << "Ten timeouts on TX set " << getHash (); - { - boost::recursive_mutex::scoped_lock sl (getApp().getMasterLock ()); - - if (getApp().getOPs ().stillNeedTXSet (mHash)) + { // FIXME: Acquire the master lock here can deadlock + psl.unlock(); { - WriteLog (lsWARNING, TransactionAcquire) << "Still need it"; - mTimeouts = 0; - aggressive = true; - } + boost::recursive_mutex::scoped_lock sl (getApp().getMasterLock ()); + + if (getApp().getOPs ().stillNeedTXSet (mHash)) + { + WriteLog (lsWARNING, TransactionAcquire) << "Still need it"; + mTimeouts = 0; + aggressive = true; + } + } + psl.lock(); } if (!aggressive) diff --git a/src/cpp/ripple/ripple_TransactionAcquire.h b/src/cpp/ripple/ripple_TransactionAcquire.h index de057dd96d..dcfa7a81b4 100644 --- a/src/cpp/ripple/ripple_TransactionAcquire.h +++ b/src/cpp/ripple/ripple_TransactionAcquire.h @@ -38,7 +38,7 @@ private: SHAMap::pointer mMap; bool mHaveRoot; - void onTimer (bool progress); + void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock); void newPeer (Peer::ref peer) { trigger (peer);