Fix a deadlock when a transaction acquire set times out.

This commit is contained in:
JoelKatz
2013-07-22 04:00:24 -07:00
parent b428e94ce8
commit 6760f5efce
6 changed files with 19 additions and 15 deletions

View File

@@ -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 ())

View File

@@ -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 ()

View File

@@ -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)

View File

@@ -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);