mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-23 12:35:50 +00:00
Don't recompute the OrderBookDB too many times more than needed.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user