20#include <xrpld/app/ledger/LedgerMaster.h>
21#include <xrpld/app/main/Application.h>
22#include <xrpld/app/paths/PathRequests.h>
23#include <xrpld/core/JobQueue.h>
25#include <xrpl/basics/Log.h>
26#include <xrpl/protocol/ErrorCodes.h>
27#include <xrpl/protocol/RPCErr.h>
28#include <xrpl/protocol/jss.h>
46 std::uint32_t const lineSeq = lineCache ? lineCache->getLedger()->seq() : 0;
48 JLOG(
mJournal.
debug()) <<
"getLineCache has cache for " << lineSeq
49 <<
", considering " << lgrSeq;
52 (authoritative && (lgrSeq > lineSeq)) ||
54 ((lgrSeq + 8) < lineSeq)) ||
55 (lgrSeq > (lineSeq + 8)))
58 <<
"getLineCache creating new cache for " << lgrSeq;
62 lineCache_ = lineCache = std::make_shared<RippleLineCache>(
85 bool mustBreak =
false;
87 JLOG(
mJournal.
trace()) <<
"updateAll seq=" << cache->getLedger()->seq()
88 <<
", " << requests.
size() <<
" requests";
90 int processed = 0, removed = 0;
94 if (
auto ipSub = request->getSubscriber();
95 ipSub && ipSub->getRequest() == request)
99 request->doAborting();
106 for (
auto const& wr : requests)
111 auto request = wr.lock();
114 <<
"updateAll request " << (request ?
"" :
"not ") <<
"found";
118 auto continueCallback = [&getSubscriber, &request]() {
122 return (
bool)getSubscriber(request);
124 if (!request->needsUpdate(
125 newRequests, cache->getLedger()->seq()))
129 if (
auto ipSub = getSubscriber(request))
131 if (!ipSub->getConsumer().warn())
138 cache,
false, continueCallback);
139 request->updateComplete();
140 update[jss::type] =
"path_find";
141 if ((ipSub = getSubscriber(request)))
143 ipSub->send(update,
false);
149 else if (request->hasCompletion())
152 request->doUpdate(cache,
false);
153 request->updateComplete();
168 [&removed, &request](
auto const& wl) {
171 if (r && r != request)
193 else if (newRequests)
219 JLOG(
mJournal.
debug()) <<
"updateAll complete: " << processed
220 <<
" processed and " << removed <<
" removed";
242 return r && !r->isNew();
255 auto req = std::make_shared<PathRequest>(
258 auto [
valid, jvRes] =
259 req->doCreate(
getLineCache(inLedger,
false), requestJson);
263 subscriber->setRequest(req);
267 return std::move(jvRes);
281 req = std::make_shared<PathRequest>(
301 return std::move(jvRes);
310 auto cache = std::make_shared<RippleLineCache>(
313 auto req = std::make_shared<PathRequest>(
316 auto [
valid, jvRes] = req->doCreate(cache, request);
318 jvRes = req->doUpdate(cache,
false);
319 return std::move(jvRes);
Stream trace() const
Severity stream access functions.
virtual beast::Journal journal(std::string const &name)=0
virtual JobQueue & getJobQueue()=0
virtual LedgerMaster & getLedgerMaster()=0
std::unique_ptr< LoadEvent > makeLoadEvent(JobType t, std::string const &name)
Return a scoped LoadEvent.
void updateAll(std::shared_ptr< ReadView const > const &ledger)
Update all of the contained PathRequest instances.
Json::Value makeLegacyPathRequest(PathRequest::pointer &req, std::function< void(void)> completion, Resource::Consumer &consumer, std::shared_ptr< ReadView const > const &inLedger, Json::Value const &request)
void insertPathRequest(PathRequest::pointer const &)
Json::Value doLegacyPathRequest(Resource::Consumer &consumer, std::shared_ptr< ReadView const > const &inLedger, Json::Value const &request)
std::weak_ptr< RippleLineCache > lineCache_
std::shared_ptr< RippleLineCache > getLineCache(std::shared_ptr< ReadView const > const &ledger, bool authoritative)
Get the current RippleLineCache, updating it if necessary.
std::recursive_mutex mLock
bool requestsPending() const
std::atomic< int > mLastIdentifier
Json::Value makePathRequest(std::shared_ptr< InfoSub > const &subscriber, std::shared_ptr< ReadView const > const &ledger, Json::Value const &request)
std::vector< PathRequest::wptr > requests_
An endpoint that consumes resources.
TER valid(PreclaimContext const &ctx, AccountID const &src)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Json::Value rpcError(int iError)