From e94f8957542ea762681e78d238532c4a99176d9b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 13 Aug 2013 12:37:37 -0700 Subject: [PATCH] Rewrite InboundLedgers to mLedgers is unordered. --- .../ledger/ripple_InboundLedgers.cpp | 68 +++++++++++-------- .../ripple_app/ledger/ripple_InboundLedgers.h | 2 +- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/modules/ripple_app/ledger/ripple_InboundLedgers.cpp b/modules/ripple_app/ledger/ripple_InboundLedgers.cpp index 2f1f6c07cf..74c356e4c5 100644 --- a/modules/ripple_app/ledger/ripple_InboundLedgers.cpp +++ b/modules/ripple_app/ledger/ripple_InboundLedgers.cpp @@ -7,33 +7,38 @@ InboundLedger::pointer InboundLedgers::findCreate (uint256 const& hash, uint32 seq) { assert (hash.isNonZero ()); - boost::mutex::scoped_lock sl (mLock); - InboundLedger::pointer& ptr = mLedgers[hash]; + InboundLedger::pointer ret; - if (ptr) - { // FIXME: Should set the sequence if it's not set - ptr->touch (); - return ptr; - } - - ptr = boost::make_shared (hash, seq); - - if (!ptr->isDone ()) { - ptr->addPeers (); - ptr->setTimer (); // Cannot call in constructor - } - else if (ptr->isComplete ()) - { - Ledger::pointer ledger = ptr->getLedger (); - ledger->setClosed (); - ledger->setImmutable (); - getApp().getLedgerMaster ().storeLedger (ledger); - WriteLog (lsDEBUG, InboundLedger) << "Acquiring ledger we already have: " << hash; + boost::mutex::scoped_lock sl (mLock); + InboundLedger::pointer& ptr = mLedgers[hash]; + + if (ptr) + { // FIXME: Should set the sequence if it's not set + ptr->touch (); + ret = ptr; + } + else + { + ptr = ret = boost::make_shared (hash, seq); + + if (!ret->isDone ()) + { + ret->addPeers (); + ret->setTimer (); // Cannot call in constructor + } + else if (ret->isComplete ()) + { + Ledger::pointer ledger = ret->getLedger (); + ledger->setClosed (); + ledger->setImmutable (); + getApp().getLedgerMaster ().storeLedger (ledger); + WriteLog (lsDEBUG, InboundLedger) << "Acquiring ledger we already have locally: " << hash; + } + } } - assert (mLedgers[hash]); - return ptr; + return ret; } InboundLedger::pointer InboundLedgers::find (uint256 const& hash) @@ -45,7 +50,7 @@ InboundLedger::pointer InboundLedgers::find (uint256 const& hash) { boost::mutex::scoped_lock sl (mLock); - std::map::iterator it = mLedgers.find (hash); + boost::unordered_map::iterator it = mLedgers.find (hash); if (it != mLedgers.end ()) { it->second->touch (); @@ -213,7 +218,7 @@ void InboundLedgers::sweep () int now = UptimeTimer::getInstance ().getElapsedSeconds (); boost::mutex::scoped_lock sl (mLock); - std::map::iterator it = mLedgers.begin (); + boost::unordered_map::iterator it = mLedgers.begin (); while (it != mLedgers.end ()) { @@ -223,7 +228,7 @@ void InboundLedgers::sweep () ++it; } else if ((it->second->getLastAction () + 60) < now) - mLedgers.erase (it++); + it = mLedgers.erase (it); else ++it; } @@ -234,14 +239,19 @@ int InboundLedgers::getFetchCount (int& timeoutCount) timeoutCount = 0; int ret = 0; - std::map inboundLedgers; + typedef std::pair u256_acq_pair; + std::vector inboundLedgers; { boost::mutex::scoped_lock sl (mLock); - inboundLedgers = mLedgers; + + inboundLedgers.reserve(mLedgers.size()); + BOOST_FOREACH (const u256_acq_pair & it, mLedgers) + { + inboundLedgers.push_back(it); + } } - typedef std::pair u256_acq_pair; BOOST_FOREACH (const u256_acq_pair & it, inboundLedgers) { if (it.second->isActive ()) diff --git a/modules/ripple_app/ledger/ripple_InboundLedgers.h b/modules/ripple_app/ledger/ripple_InboundLedgers.h index 5eb9dcf7c2..12be0b1034 100644 --- a/modules/ripple_app/ledger/ripple_InboundLedgers.h +++ b/modules/ripple_app/ledger/ripple_InboundLedgers.h @@ -65,7 +65,7 @@ public: private: boost::mutex mLock; - std::map mLedgers; + boost::unordered_map mLedgers; KeyCache mRecentFailures; };