Don't recompute the OrderBookDB too many times more than needed.

This commit is contained in:
JoelKatz
2013-02-13 09:31:52 -08:00
parent ef82b050ed
commit ef3dd3ca77
5 changed files with 30 additions and 7 deletions

View File

@@ -555,6 +555,9 @@ TER OfferCreateTransactor::doApply()
tLog(tesSUCCESS != terResult, lsINFO) << boost::str(boost::format("OfferCreate: final terResult=%s") % transToken(terResult)); tLog(tesSUCCESS != terResult, lsINFO) << boost::str(boost::format("OfferCreate: final terResult=%s") % transToken(terResult));
if (isTesSuccess(terResult))
theApp->getOrderBookDB().invalidate();
return terResult; return terResult;
} }

View File

@@ -6,14 +6,26 @@
SETUP_LOG(); 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 // TODO: this would be way faster if we could just look under the order dirs
void OrderBookDB::setup(Ledger::ref ledger) 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); LoadEvent::autoptr ev = theApp->getJobQueue().getLoadEventAP(jtOB_SETUP);
mXRPOrders.clear(); mXRPOrders.clear();
@@ -64,6 +76,7 @@ void OrderBookDB::setup(Ledger::ref ledger)
// return list of all orderbooks that want IssuerID // return list of all orderbooks that want IssuerID
std::vector<OrderBook::pointer>& OrderBookDB::getBooks(const uint160& issuerID) std::vector<OrderBook::pointer>& OrderBookDB::getBooks(const uint160& issuerID)
{ {
boost::recursive_mutex::scoped_lock sl(mLock);
std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID); std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID);
return (it == mIssuerMap.end()) return (it == mIssuerMap.end())
? mEmptyVector ? mEmptyVector
@@ -73,6 +86,7 @@ std::vector<OrderBook::pointer>& OrderBookDB::getBooks(const uint160& issuerID)
// return list of all orderbooks that want this issuerID and currencyID // return list of all orderbooks that want this issuerID and currencyID
void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, std::vector<OrderBook::pointer>& bookRet) void OrderBookDB::getBooks(const uint160& issuerID, const uint160& currencyID, std::vector<OrderBook::pointer>& bookRet)
{ {
boost::recursive_mutex::scoped_lock sl(mLock);
std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID); std::map< uint160, std::vector<OrderBook::pointer> >::iterator it = mIssuerMap.find(issuerID);
if (it != mIssuerMap.end()) 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) 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); BookListeners::pointer ret=getBookListeners(currencyIn, currencyOut, issuerIn, issuerOut);
if(!ret) 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) BookListeners::pointer OrderBookDB::getBookListeners(uint160 currencyIn, uint160 currencyOut, uint160 issuerIn, uint160 issuerOut)
{ {
boost::recursive_mutex::scoped_lock sl(mLock);
std::map<uint160, std::map<uint160, std::map<uint160, std::map<uint160, BookListeners::pointer> > > >::iterator it0=mListeners.find(issuerIn); std::map<uint160, std::map<uint160, std::map<uint160, std::map<uint160, BookListeners::pointer> > > >::iterator it0=mListeners.find(issuerIn);
if(it0 != mListeners.end()) 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 // We need to determine which streams a given meta effects
void OrderBookDB::processTxn(const SerializedTransaction& stTxn, TER terResult,TransactionMetaSet::pointer& meta,Json::Value& jvObj) void OrderBookDB::processTxn(const SerializedTransaction& stTxn, TER terResult,TransactionMetaSet::pointer& meta,Json::Value& jvObj)
{ {
boost::recursive_mutex::scoped_lock sl(mLock);
if(terResult==tesSUCCESS) if(terResult==tesSUCCESS)
{ {
// check if this is an offer or an offer cancel or a payment that consumes an offer // check if this is an offer or an offer cancel or a payment that consumes an offer

View File

@@ -35,9 +35,13 @@ class OrderBookDB
std::map<uint256, bool > mKnownMap; std::map<uint256, bool > mKnownMap;
uint32 mSeq;
boost::recursive_mutex mLock;
public: public:
OrderBookDB(); OrderBookDB();
void setup(Ledger::ref ledger); void setup(Ledger::ref ledger);
void invalidate();
// return list of all orderbooks that want XRP // return list of all orderbooks that want XRP
std::vector<OrderBook::pointer>& getXRPInBooks(){ return mXRPOrders; } std::vector<OrderBook::pointer>& getXRPInBooks(){ return mXRPOrders; }

View File

@@ -139,7 +139,7 @@ Pathfinder::Pathfinder(Ledger::ref ledger,
mLedger(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); 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) else if (!speEnd.mCurrencyID)
{ {
// Cursor is for XRP, continue with qualifying books: XRP -> non-XRP // 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. // 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<OrderBook::pointer> books; std::vector<OrderBook::pointer> books;
mOrderBook.getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books); theApp->getOrderBookDB().getBooks(speEnd.mIssuerID, speEnd.mCurrencyID, books);
BOOST_FOREACH(OrderBook::ref book, books) BOOST_FOREACH(OrderBook::ref book, books)
{ {
@@ -593,7 +593,7 @@ void Pathfinder::addOptions(PathOption::pointer tail)
{ {
if (!tail->mCurrencyID) if (!tail->mCurrencyID)
{ // source XRP { // source XRP
BOOST_FOREACH(OrderBook::ref book, mOrderBook.getXRPInBooks()) BOOST_FOREACH(OrderBook::ref book, theApp->getOrderBookDB().getXRPInBooks())
{ {
PathOption::pointer pathOption(new PathOption(tail)); PathOption::pointer pathOption(new PathOption(tail));
@@ -627,7 +627,7 @@ void Pathfinder::addOptions(PathOption::pointer tail)
// every offer that wants the source currency // every offer that wants the source currency
std::vector<OrderBook::pointer> books; std::vector<OrderBook::pointer> books;
mOrderBook.getBooks(tail->mCurrentAccount, tail->mCurrencyID, books); theApp->getOrderBookDB().getBooks(tail->mCurrentAccount, tail->mCurrencyID, books);
BOOST_FOREACH(OrderBook::ref book,books) BOOST_FOREACH(OrderBook::ref book,books)
{ {

View File

@@ -43,7 +43,6 @@ class Pathfinder
uint160 mSrcIssuerID; uint160 mSrcIssuerID;
STAmount mSrcAmount; STAmount mSrcAmount;
OrderBookDB mOrderBook;
Ledger::pointer mLedger; Ledger::pointer mLedger;
PathState::pointer mPsDefault; PathState::pointer mPsDefault;
LoadEvent::pointer mLoadMonitor; LoadEvent::pointer mLoadMonitor;