mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-28 06:55:50 +00:00
Fix a deadlock when a transaction acquire set times out.
This commit is contained in:
@@ -138,7 +138,7 @@ bool InboundLedger::tryLocal ()
|
|||||||
return mComplete;
|
return mComplete;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InboundLedger::onTimer (bool progress)
|
void InboundLedger::onTimer (bool progress, boost::recursive_mutex::scoped_lock&)
|
||||||
{
|
{
|
||||||
mRecentTXNodes.clear ();
|
mRecentTXNodes.clear ();
|
||||||
mRecentASNodes.clear ();
|
mRecentASNodes.clear ();
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void done ();
|
void done ();
|
||||||
|
|
||||||
void onTimer (bool progress);
|
void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock);
|
||||||
|
|
||||||
void newPeer (Peer::ref peer)
|
void newPeer (Peer::ref peer)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,12 +54,12 @@ void PeerSet::invokeOnTimer ()
|
|||||||
{
|
{
|
||||||
++mTimeouts;
|
++mTimeouts;
|
||||||
WriteLog (lsWARNING, InboundLedger) << "Timeout(" << mTimeouts << ") pc=" << mPeers.size () << " acquiring " << mHash;
|
WriteLog (lsWARNING, InboundLedger) << "Timeout(" << mTimeouts << ") pc=" << mPeers.size () << " acquiring " << mHash;
|
||||||
onTimer (false);
|
onTimer (false, sl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mProgress = false;
|
mProgress = false;
|
||||||
onTimer (true);
|
onTimer (true, sl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDone ())
|
if (!isDone ())
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ protected:
|
|||||||
virtual ~PeerSet () { }
|
virtual ~PeerSet () { }
|
||||||
|
|
||||||
virtual void newPeer (Peer::ref) = 0;
|
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;
|
virtual boost::weak_ptr<PeerSet> pmDowncast () = 0;
|
||||||
|
|
||||||
void setComplete ()
|
void setComplete ()
|
||||||
|
|||||||
@@ -44,22 +44,26 @@ void TransactionAcquire::done ()
|
|||||||
getApp().getIOService ().post (BIND_TYPE (&TACompletionHandler, mHash, map));
|
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;
|
bool aggressive = false;
|
||||||
|
|
||||||
if (getTimeouts () > 10)
|
if (getTimeouts () > 10)
|
||||||
{
|
{
|
||||||
WriteLog (lsWARNING, TransactionAcquire) << "Ten timeouts on TX set " << getHash ();
|
WriteLog (lsWARNING, TransactionAcquire) << "Ten timeouts on TX set " << getHash ();
|
||||||
{
|
{ // FIXME: Acquire the master lock here can deadlock
|
||||||
boost::recursive_mutex::scoped_lock sl (getApp().getMasterLock ());
|
psl.unlock();
|
||||||
|
|
||||||
if (getApp().getOPs ().stillNeedTXSet (mHash))
|
|
||||||
{
|
{
|
||||||
WriteLog (lsWARNING, TransactionAcquire) << "Still need it";
|
boost::recursive_mutex::scoped_lock sl (getApp().getMasterLock ());
|
||||||
mTimeouts = 0;
|
|
||||||
aggressive = true;
|
if (getApp().getOPs ().stillNeedTXSet (mHash))
|
||||||
}
|
{
|
||||||
|
WriteLog (lsWARNING, TransactionAcquire) << "Still need it";
|
||||||
|
mTimeouts = 0;
|
||||||
|
aggressive = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
psl.lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aggressive)
|
if (!aggressive)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ private:
|
|||||||
SHAMap::pointer mMap;
|
SHAMap::pointer mMap;
|
||||||
bool mHaveRoot;
|
bool mHaveRoot;
|
||||||
|
|
||||||
void onTimer (bool progress);
|
void onTimer (bool progress, boost::recursive_mutex::scoped_lock& peerSetLock);
|
||||||
void newPeer (Peer::ref peer)
|
void newPeer (Peer::ref peer)
|
||||||
{
|
{
|
||||||
trigger (peer);
|
trigger (peer);
|
||||||
|
|||||||
Reference in New Issue
Block a user