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));
if (isTesSuccess(terResult))
theApp->getOrderBookDB().invalidate();
return terResult;
}

View File

@@ -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<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);
return (it == mIssuerMap.end())
? 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
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);
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<uint160, std::map<uint160, std::map<uint160, std::map<uint160, BookListeners::pointer> > > >::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

View File

@@ -35,9 +35,13 @@ class OrderBookDB
std::map<uint256, bool > 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<OrderBook::pointer>& getXRPInBooks(){ return mXRPOrders; }

View File

@@ -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<OrderBook::pointer> 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<OrderBook::pointer> books;
mOrderBook.getBooks(tail->mCurrentAccount, tail->mCurrencyID, books);
theApp->getOrderBookDB().getBooks(tail->mCurrentAccount, tail->mCurrencyID, books);
BOOST_FOREACH(OrderBook::ref book,books)
{

View File

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