mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-20 19:15:54 +00:00
Fix a deadlock when a transaction acquire set times out.
This commit is contained in:
@@ -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 ())
|
||||
|
||||
@@ -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<PeerSet> pmDowncast () = 0;
|
||||
|
||||
void setComplete ()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user