From 647c0e302a1f2faf6fdb936c40f82a19b0222a62 Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Thu, 3 Oct 2013 16:36:33 -0700 Subject: [PATCH] Do the tryLocal/addPeers operations on an InboundLedger without the collection lock. --- src/ripple_app/ledger/InboundLedger.cpp | 21 +++++++++++++++++++++ src/ripple_app/ledger/InboundLedger.h | 1 + src/ripple_app/ledger/InboundLedgers.cpp | 17 +---------------- src/ripple_app/ledger/InboundLedgers.h | 2 +- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/ripple_app/ledger/InboundLedger.cpp b/src/ripple_app/ledger/InboundLedger.cpp index 562f0f9f4..564f06ee8 100644 --- a/src/ripple_app/ledger/InboundLedger.cpp +++ b/src/ripple_app/ledger/InboundLedger.cpp @@ -58,6 +58,27 @@ InboundLedger::~InboundLedger () { } +void InboundLedger::init(ScopedLockType& collectionLock, bool couldBeNew) +{ + ScopedLockType sl (mLock, __FILE__, __LINE__); + collectionLock.unlock (); + + if (!tryLocal ()) + { + addPeers (); + setTimer (); + } + else if (!isFailed ()) + { + WriteLog (lsDEBUG, InboundLedger) << "Acquiring ledger we already have locally: " << getHash (); + mLedger->setClosed (); + mLedger->setImmutable (); + getApp ().getLedgerMaster ().storeLedger (mLedger); + if (couldBeNew) + getApp ().getLedgerMaster ().checkAccept (mLedger); + } +} + bool InboundLedger::tryLocal () { // return value: true = no more work to do diff --git a/src/ripple_app/ledger/InboundLedger.h b/src/ripple_app/ledger/InboundLedger.h index f4f0b2eb3..d7c7e0bf4 100644 --- a/src/ripple_app/ledger/InboundLedger.h +++ b/src/ripple_app/ledger/InboundLedger.h @@ -83,6 +83,7 @@ public: void awaitData (); void noAwaitData (); bool checkLocal (); + void init(ScopedLockType& collectionLock, bool couldBeNew); typedef std::pair neededHash_t; diff --git a/src/ripple_app/ledger/InboundLedgers.cpp b/src/ripple_app/ledger/InboundLedgers.cpp index c202f4171..84a2b2c65 100644 --- a/src/ripple_app/ledger/InboundLedgers.cpp +++ b/src/ripple_app/ledger/InboundLedgers.cpp @@ -48,22 +48,7 @@ InboundLedger::pointer InboundLedgers::findCreate (uint256 const& hash, uint32 s ret = boost::make_shared (hash, seq); assert (ret); mLedgers.insert (std::make_pair (hash, ret)); - - if (!ret->tryLocal()) - { - ret->addPeers (); - ret->setTimer (); // Cannot call in constructor - } - else if (!ret->isFailed ()) - { - WriteLog (lsDEBUG, InboundLedger) << "Acquiring ledger we already have locally: " << hash; - Ledger::pointer ledger = ret->getLedger (); - ledger->setClosed (); - ledger->setImmutable (); - getApp().getLedgerMaster ().storeLedger (ledger); - if (couldBeNew) - getApp().getLedgerMaster().checkAccept(ledger); - } + ret->init (sl, couldBeNew); } } } diff --git a/src/ripple_app/ledger/InboundLedgers.h b/src/ripple_app/ledger/InboundLedgers.h index f555d2a50..79661f08b 100644 --- a/src/ripple_app/ledger/InboundLedgers.h +++ b/src/ripple_app/ledger/InboundLedgers.h @@ -81,7 +81,7 @@ public: private: typedef boost::unordered_map MapType; - typedef RippleMutex LockType; + typedef RippleRecursiveMutex LockType; typedef LockType::ScopedLockType ScopedLockType; LockType mLock;