From 5fe7240b56deb10f7a48962a47aa30611dd6da5d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 6 Mar 2013 03:28:31 -0800 Subject: [PATCH] Cleanup and optimize order book DB generation. --- src/cpp/ripple/OrderBook.cpp | 7 ------- src/cpp/ripple/OrderBook.h | 11 ++++++----- src/cpp/ripple/OrderBookDB.cpp | 23 ++++++++++++----------- src/cpp/ripple/OrderBookDB.h | 2 -- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/cpp/ripple/OrderBook.cpp b/src/cpp/ripple/OrderBook.cpp index c56027073..d71da9861 100644 --- a/src/cpp/ripple/OrderBook.cpp +++ b/src/cpp/ripple/OrderBook.cpp @@ -1,13 +1,6 @@ #include "OrderBook.h" #include "Ledger.h" -OrderBook::pointer OrderBook::newOrderBook(SerializedLedgerEntry::ref ledgerEntry) -{ - if(ledgerEntry->getType() != ltOFFER) return( OrderBook::pointer()); - - return( OrderBook::pointer(new OrderBook(ledgerEntry))); -} - OrderBook::OrderBook(SerializedLedgerEntry::ref ledgerEntry) { const STAmount saTakerGets = ledgerEntry->getFieldAmount(sfTakerGets); diff --git a/src/cpp/ripple/OrderBook.h b/src/cpp/ripple/OrderBook.h index 48395f8b5..f4bce4a18 100644 --- a/src/cpp/ripple/OrderBook.h +++ b/src/cpp/ripple/OrderBook.h @@ -27,11 +27,12 @@ public: typedef const boost::shared_ptr& ref; OrderBook(const uint256& index, const uint160& ci, const uint160& co, const uint160& ii, const uint160& io) : - mBookBase(index), mCurrencyIn(ci), mCurrencyOut(co), mIssuerIn(ii), mIssuerOut(io) { ; } - - // returns NULL if ledgerEntry doesn't point to an order - // if ledgerEntry is an Order it creates the OrderBook this order would live in - static OrderBook::pointer newOrderBook(SerializedLedgerEntry::ref ledgerEntry); + mBookBase(index), + mCurrencyIn(ci), + mCurrencyOut(co), + mIssuerIn(ii), + mIssuerOut(io) + { ; } uint256& getBookBase(){ return(mBookBase); } uint160& getCurrencyIn(){ return(mCurrencyIn); } diff --git a/src/cpp/ripple/OrderBookDB.cpp b/src/cpp/ripple/OrderBookDB.cpp index 3b6de2135..8cdaa42bd 100644 --- a/src/cpp/ripple/OrderBookDB.cpp +++ b/src/cpp/ripple/OrderBookDB.cpp @@ -20,6 +20,8 @@ void OrderBookDB::invalidate() // TODO: this would be way faster if we could just look under the order dirs void OrderBookDB::setup(Ledger::ref ledger) { + boost::unordered_set mSeen; + boost::recursive_mutex::scoped_lock sl(mLock); if (ledger->getLedgerSeq() == mSeq) @@ -30,7 +32,6 @@ void OrderBookDB::setup(Ledger::ref ledger) mXRPOrders.clear(); mIssuerMap.clear(); - mKnownMap.clear(); // walk through the entire ledger looking for orderbook entries uint256 currentIndex = ledger->getFirstLedgerIndex(); @@ -40,19 +41,19 @@ void OrderBookDB::setup(Ledger::ref ledger) while (currentIndex.isNonZero()) { SLE::pointer entry = ledger->getSLEi(currentIndex); - OrderBook::pointer book = OrderBook::newOrderBook(entry); - if (book) + if ((entry->getType() == ltDIR_NODE) && (entry->isFieldPresent(sfExchangeRate)) && + (entry->getFieldH256(sfRootIndex) == currentIndex)) { - cLog(lsTRACE) << "OrderBookDB: found book"; + const uint160& ci = entry->getFieldH160(sfTakerPaysCurrency); + const uint160& co = entry->getFieldH160(sfTakerGetsCurrency); + const uint160& ii = entry->getFieldH160(sfTakerPaysIssuer); + const uint160& io = entry->getFieldH160(sfTakerGetsIssuer); - if (mKnownMap.find(book->getBookBase()) == mKnownMap.end()) + uint256 index = Ledger::getBookBase(ci, ii, co, io); + if (mSeen.insert(index).second) { - mKnownMap[book->getBookBase()] = true; - - cLog(lsTRACE) << "OrderBookDB: unknown book in: " - << STAmount::createHumanCurrency(book->getCurrencyIn()) - << " -> " - << STAmount::createHumanCurrency(book->getCurrencyOut()); + OrderBook::pointer book = boost::make_shared(boost::cref(index), + boost::cref(ci), boost::cref(co), boost::cref(ii), boost::cref(io)); if (!book->getCurrencyIn()) // XRP mXRPOrders.push_back(book); diff --git a/src/cpp/ripple/OrderBookDB.h b/src/cpp/ripple/OrderBookDB.h index f5119e88b..b5a95e43b 100644 --- a/src/cpp/ripple/OrderBookDB.h +++ b/src/cpp/ripple/OrderBookDB.h @@ -38,8 +38,6 @@ class OrderBookDB // issuerIn, issuerOut, currencyIn, currencyOut std::map > > > mListeners; - std::map mKnownMap; - uint32 mSeq; boost::recursive_mutex mLock;