From ef3dd3ca778bc3f4e932f095b4d63eae81249d54 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 13 Feb 2013 09:31:52 -0800 Subject: [PATCH] Don't recompute the OrderBookDB too many times more than needed. --- src/cpp/ripple/OfferCreateTransactor.cpp | 3 +++ src/cpp/ripple/OrderBookDB.cpp | 19 ++++++++++++++++++- src/cpp/ripple/OrderBookDB.h | 4 ++++ src/cpp/ripple/Pathfinder.cpp | 10 +++++----- src/cpp/ripple/Pathfinder.h | 1 - 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/cpp/ripple/OfferCreateTransactor.cpp b/src/cpp/ripple/OfferCreateTransactor.cpp index 71864e332..76f563660 100644 --- a/src/cpp/ripple/OfferCreateTransactor.cpp +++ b/src/cpp/ripple/OfferCreateTransactor.cpp @@ -555,6 +555,9 @@ TER OfferCreateTransactor::doApply() tLog(tesSUCCESS != terResult, lsINFO) << boost::str(boost::format("OfferCreate: final terResult=%s") % transToken(terResult)); + if (isTesSuccess(terResult)) + theApp->getOrderBookDB().invalidate(); + return terResult; } diff --git a/src/cpp/ripple/OrderBookDB.cpp b/src/cpp/ripple/OrderBookDB.cpp index d09800e6d..2aed79cf8 100644 --- a/src/cpp/ripple/OrderBookDB.cpp +++ b/src/cpp/ripple/OrderBookDB.cpp @@ -6,14 +6,26 @@ SETUP_LOG(); -OrderBookDB::OrderBookDB() +OrderBookDB::OrderBookDB() : mSeq(0) { } +void OrderBookDB::invalidate() +{ + boost::recursive_mutex::scoped_lock sl(mLock); + mSeq = 0; +} + // TODO: this would be way faster if we could just look under the order dirs void OrderBookDB::setup(Ledger::ref ledger) { + boost::recursive_mutex::scoped_lock sl(mLock); + + if (ledger->getLedgerSeq() == mSeq) + return; + mSeq = ledger->getLedgerSeq(); + LoadEvent::autoptr ev = theApp->getJobQueue().getLoadEventAP(jtOB_SETUP); mXRPOrders.clear(); @@ -64,6 +76,7 @@ void OrderBookDB::setup(Ledger::ref ledger) // return list of all orderbooks that want IssuerID std::vector& OrderBookDB::getBooks(const uint160& issuerID) { + boost::recursive_mutex::scoped_lock sl(mLock); std::map< uint160, std::vector >::iterator it = mIssuerMap.find(issuerID); return (it == mIssuerMap.end()) ? mEmptyVector @@ -73,6 +86,7 @@ std::vector& OrderBookDB::getBooks(const uint160& issuerID) // return list of all orderbooks that want this issuerID and currencyID void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, std::vector& bookRet) { + boost::recursive_mutex::scoped_lock sl(mLock); std::map< uint160, std::vector >::iterator it = mIssuerMap.find(issuerID); if (it != mIssuerMap.end()) { @@ -86,6 +100,7 @@ void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, s BookListeners::pointer OrderBookDB::makeBookListeners(uint160 currencyIn, uint160 currencyOut, uint160 issuerIn, uint160 issuerOut) { + boost::recursive_mutex::scoped_lock sl(mLock); BookListeners::pointer ret=getBookListeners(currencyIn, currencyOut, issuerIn, issuerOut); if(!ret) { @@ -97,6 +112,7 @@ BookListeners::pointer OrderBookDB::makeBookListeners(uint160 currencyIn, uint16 BookListeners::pointer OrderBookDB::getBookListeners(uint160 currencyIn, uint160 currencyOut, uint160 issuerIn, uint160 issuerOut) { + boost::recursive_mutex::scoped_lock sl(mLock); std::map > > >::iterator it0=mListeners.find(issuerIn); if(it0 != mListeners.end()) { @@ -168,6 +184,7 @@ BookListeners::pointer OrderBookDB::getBookListeners(uint160 currencyIn, uint160 // We need to determine which streams a given meta effects void OrderBookDB::processTxn(const SerializedTransaction& stTxn, TER terResult,TransactionMetaSet::pointer& meta,Json::Value& jvObj) { + boost::recursive_mutex::scoped_lock sl(mLock); if(terResult==tesSUCCESS) { // check if this is an offer or an offer cancel or a payment that consumes an offer diff --git a/src/cpp/ripple/OrderBookDB.h b/src/cpp/ripple/OrderBookDB.h index 6ec205d71..c3b99fda4 100644 --- a/src/cpp/ripple/OrderBookDB.h +++ b/src/cpp/ripple/OrderBookDB.h @@ -35,9 +35,13 @@ class OrderBookDB std::map mKnownMap; + uint32 mSeq; + boost::recursive_mutex mLock; + public: OrderBookDB(); void setup(Ledger::ref ledger); + void invalidate(); // return list of all orderbooks that want XRP std::vector& getXRPInBooks(){ return mXRPOrders; } diff --git a/src/cpp/ripple/Pathfinder.cpp b/src/cpp/ripple/Pathfinder.cpp index 720843dea..33f1abd9a 100644 --- a/src/cpp/ripple/Pathfinder.cpp +++ b/src/cpp/ripple/Pathfinder.cpp @@ -139,7 +139,7 @@ Pathfinder::Pathfinder(Ledger::ref ledger, mLedger(ledger) { - mOrderBook.setup(mLedger); // TODO: have the orderbook update itself rather than rebuild it from scratch each time + theApp->getOrderBookDB().setup(mLedger); mLoadMonitor = theApp->getJobQueue().getLoadEvent(jtPATH_FIND); @@ -351,7 +351,7 @@ bool Pathfinder::findPaths(const unsigned int iMaxSteps, const unsigned int iMax else if (!speEnd.mCurrencyID) { // Cursor is for XRP, continue with qualifying books: XRP -> non-XRP - BOOST_FOREACH(OrderBook::ref book, mOrderBook.getXRPInBooks()) + BOOST_FOREACH(OrderBook::ref book, theApp->getOrderBookDB().getXRPInBooks()) { // New end is an order book with the currency and issuer. @@ -445,7 +445,7 @@ bool Pathfinder::findPaths(const unsigned int iMaxSteps, const unsigned int iMax std::vector books; - mOrderBook.getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books); + theApp->getOrderBookDB().getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books); BOOST_FOREACH(OrderBook::ref book, books) { @@ -593,7 +593,7 @@ void Pathfinder::addOptions(PathOption::pointer tail) { if (!tail->mCurrencyID) { // source XRP - BOOST_FOREACH(OrderBook::ref book, mOrderBook.getXRPInBooks()) + BOOST_FOREACH(OrderBook::ref book, theApp->getOrderBookDB().getXRPInBooks()) { PathOption::pointer pathOption(new PathOption(tail)); @@ -627,7 +627,7 @@ void Pathfinder::addOptions(PathOption::pointer tail) // every offer that wants the source currency std::vector books; - mOrderBook.getBooks(tail->mCurrentAccount, tail->mCurrencyID, books); + theApp->getOrderBookDB().getBooks(tail->mCurrentAccount, tail->mCurrencyID, books); BOOST_FOREACH(OrderBook::ref book,books) { diff --git a/src/cpp/ripple/Pathfinder.h b/src/cpp/ripple/Pathfinder.h index 7ba42bb81..135bc3e2f 100644 --- a/src/cpp/ripple/Pathfinder.h +++ b/src/cpp/ripple/Pathfinder.h @@ -43,7 +43,6 @@ class Pathfinder uint160 mSrcIssuerID; STAmount mSrcAmount; - OrderBookDB mOrderBook; Ledger::pointer mLedger; PathState::pointer mPsDefault; LoadEvent::pointer mLoadMonitor;