Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
BackendInterface.hpp
1#pragma once
2
3#include "data/DBHelpers.hpp"
4#include "data/LedgerCacheInterface.hpp"
5#include "data/Types.hpp"
6#include "etl/CorruptionDetector.hpp"
7#include "util/Retry.hpp"
8#include "util/Spawn.hpp"
9#include "util/log/Logger.hpp"
10
11#include <boost/asio/executor_work_guard.hpp>
12#include <boost/asio/io_context.hpp>
13#include <boost/asio/spawn.hpp>
14#include <boost/json.hpp>
15#include <boost/json/object.hpp>
16#include <boost/utility/result_of.hpp>
17#include <boost/uuid/uuid.hpp>
18#include <xrpl/basics/base_uint.h>
19#include <xrpl/protocol/AccountID.h>
20#include <xrpl/protocol/Fees.h>
21#include <xrpl/protocol/LedgerHeader.h>
22
23#include <chrono>
24#include <cstddef>
25#include <cstdint>
26#include <exception>
27#include <functional>
28#include <optional>
29#include <shared_mutex>
30#include <string>
31#include <thread>
32#include <type_traits>
33#include <utility>
34#include <vector>
35
36namespace data {
37
41class DatabaseError : public std::exception {
42 std::string message_{"Transient database error. Please retry the request"};
43
44public:
45 DatabaseError() = default;
46
52 explicit DatabaseError(std::string message) : message_{std::move(message)}
53 {
54 }
55
59 [[nodiscard]] char const*
60 what() const noexcept override
61 {
62 return message_.c_str();
63 }
64};
65
69static constexpr std::chrono::milliseconds kDefaultWaitBetweenRetry{500};
70
74static constexpr std::chrono::milliseconds kMaxWaitBetweenRetry{5'000};
75
83
93template <typename FnType>
94auto
96 FnType func,
97 boost::asio::yield_context yield,
99)
100{
101 static util::Logger const log{"Backend"}; // NOLINT(readability-identifier-naming)
102
103 auto retry = util::makeRetryExponentialBackoff(delays, yield.get_executor());
104
105 while (true) {
106 // Suspending a coroutine from inside a catch block is not safe so we copy out the failure.
107 std::string failure;
108
109 try {
110 return func();
111 } catch (DatabaseError const& e) {
112 failure = e.what();
113 }
114
115 auto const delayMs =
116 std::chrono::duration_cast<std::chrono::milliseconds>(retry.delayValue()).count();
117 LOG(log.error()) << failure << " (attempt " << retry.attemptNumber() + 1
118 << "). Retrying in " << delayMs << "ms ...";
119
120 retry.wait(yield);
121 }
122}
123
134template <typename FnType>
135auto
137{
138 static util::Logger const log{"Backend"}; // NOLINT(readability-identifier-naming)
139
140 util::ExponentialBackoffStrategy backoff{delays};
141 std::size_t attempt = 1;
142
143 while (true) {
144 try {
145 return func();
146 } catch (DatabaseError const& e) {
147 auto const delay = backoff.getDelay();
148 LOG(log.error()) << e.what() << " (attempt " << attempt << "). Retrying in "
149 << std::chrono::duration_cast<std::chrono::milliseconds>(delay).count()
150 << "ms ...";
151
152 ++attempt;
153
154 std::this_thread::sleep_for(delay);
155 backoff.increaseDelay();
156 }
157 }
158}
159
167template <typename FnType>
168auto
169synchronous(FnType&& func)
170{
171 boost::asio::io_context ctx;
172
173 using R = boost::result_of<FnType(boost::asio::yield_context)>::type;
174 if constexpr (!std::is_same_v<R, void>) {
175 R res;
176 util::spawn(ctx, [_ = boost::asio::make_work_guard(ctx), &func, &res](auto yield) {
177 res = func(yield);
178 });
179
180 ctx.run();
181 return res;
182 } else {
183 util::spawn(ctx, [_ = boost::asio::make_work_guard(ctx), &func](auto yield) {
184 func(yield);
185 });
186 ctx.run();
187 }
188}
189
201template <typename FnType>
202auto
204{
205 return retryOnTimeout([&]() { return synchronous(func); }, delays);
206}
207
212protected:
213 util::Logger log_{"Backend"};
214 mutable std::shared_mutex rngMtx_;
215 std::optional<LedgerRange> range_;
216 std::reference_wrapper<LedgerCacheInterface> cache_;
217 std::optional<etl::CorruptionDetector> corruptionDetector_;
218
219public:
228
229 virtual ~BackendInterface() = default;
230
234 [[nodiscard]] virtual std::chrono::milliseconds
236 {
238 }
239
243 [[nodiscard]] virtual std::chrono::milliseconds
245 {
247 }
248
249 // TODO https://github.com/XRPLF/clio/issues/1956: Remove this hack once old ETL is removed.
250 // Cache should not be exposed thru BackendInterface
251
256 cache() const
257 {
258 return cache_;
259 }
260
266 {
267 return cache_;
268 }
269
275 void
277 {
278 corruptionDetector_ = std::move(detector);
279 }
280
288 virtual std::optional<xrpl::LedgerHeader>
289 fetchLedgerBySequence(std::uint32_t sequence, boost::asio::yield_context yield) const = 0;
290
298 virtual std::optional<xrpl::LedgerHeader>
299 fetchLedgerByHash(xrpl::uint256 const& hash, boost::asio::yield_context yield) const = 0;
300
307 virtual std::optional<std::uint32_t>
308 fetchLatestLedgerSequence(boost::asio::yield_context yield) const = 0;
309
315 std::optional<LedgerRange>
316 fetchLedgerRange() const;
317
328 virtual std::vector<xrpl::uint256>
330 std::uint32_t number,
331 std::uint32_t pageSize,
332 std::uint32_t seq,
333 boost::asio::yield_context yield
334 ) const = 0;
335
341 void
342 updateRange(uint32_t newMax);
343
350 void
351 forceUpdateRange(uint32_t newMax);
352
360 void
361 setRange(uint32_t min, uint32_t max, bool force = false);
362
370 std::optional<xrpl::Fees>
371 fetchFees(std::uint32_t seq, boost::asio::yield_context yield) const;
372
380 virtual std::optional<TransactionAndMetadata>
381 fetchTransaction(xrpl::uint256 const& hash, boost::asio::yield_context yield) const = 0;
382
390 virtual std::vector<TransactionAndMetadata>
392 std::vector<xrpl::uint256> const& hashes,
393 boost::asio::yield_context yield
394 ) const = 0;
395
408 xrpl::AccountID const& account,
409 std::uint32_t limit,
410 bool forward,
411 std::optional<TransactionsCursor> const& txnCursor,
412 boost::asio::yield_context yield
413 ) const = 0;
414
422 virtual std::vector<TransactionAndMetadata>
424 std::uint32_t ledgerSequence,
425 boost::asio::yield_context yield
426 ) const = 0;
427
435 virtual std::vector<xrpl::uint256>
437 std::uint32_t ledgerSequence,
438 boost::asio::yield_context yield
439 ) const = 0;
440
449 virtual std::optional<NFT>
451 xrpl::uint256 const& tokenID,
452 std::uint32_t ledgerSequence,
453 boost::asio::yield_context yield
454 ) const = 0;
455
468 xrpl::uint256 const& tokenID,
469 std::uint32_t limit,
470 bool forward,
471 std::optional<TransactionsCursor> const& cursorIn,
472 boost::asio::yield_context yield
473 ) const = 0;
474
487 virtual NFTsAndCursor
489 xrpl::AccountID const& issuer,
490 std::optional<std::uint32_t> const& taxon,
491 std::uint32_t ledgerSequence,
492 std::uint32_t limit,
493 std::optional<xrpl::uint256> const& cursorIn,
494 boost::asio::yield_context yield
495 ) const = 0;
496
507 virtual MPTHoldersAndCursor
509 xrpl::uint192 const& mptID,
510 std::uint32_t const limit,
511 std::optional<xrpl::AccountID> const& cursorIn,
512 std::uint32_t const ledgerSequence,
513 boost::asio::yield_context yield
514 ) const = 0;
515
534 xrpl::uint192 const& mptIssuanceID,
535 std::uint32_t limit,
536 bool forward,
537 std::optional<TransactionsCursor> const& cursorIn,
538 boost::asio::yield_context yield
539 ) const = 0;
540
562 xrpl::uint192 const& mptIssuanceID,
563 xrpl::AccountID const& account,
564 std::uint32_t limit,
565 bool forward,
566 std::optional<TransactionsCursor> const& cursorIn,
567 boost::asio::yield_context yield
568 ) const = 0;
569
581 std::optional<Blob>
583 xrpl::uint256 const& key,
584 std::uint32_t sequence,
585 boost::asio::yield_context yield
586 ) const;
587
598 std::optional<std::uint32_t>
600 xrpl::uint256 const& key,
601 std::uint32_t sequence,
602 boost::asio::yield_context yield
603 ) const;
604
617 std::vector<Blob>
619 std::vector<xrpl::uint256> const& keys,
620 std::uint32_t sequence,
621 boost::asio::yield_context yield
622 ) const;
623
632 virtual std::optional<Blob>
634 xrpl::uint256 const& key,
635 std::uint32_t sequence,
636 boost::asio::yield_context yield
637 ) const = 0;
638
647 virtual std::optional<std::uint32_t>
649 xrpl::uint256 const& key,
650 std::uint32_t sequence,
651 boost::asio::yield_context yield
652 ) const = 0;
653
662 virtual std::vector<Blob>
664 std::vector<xrpl::uint256> const& keys,
665 std::uint32_t sequence,
666 boost::asio::yield_context yield
667 ) const = 0;
668
676 virtual std::vector<LedgerObject>
677 fetchLedgerDiff(std::uint32_t ledgerSequence, boost::asio::yield_context yield) const = 0;
678
691 std::optional<xrpl::uint256> const& cursor,
692 std::uint32_t ledgerSequence,
693 std::uint32_t limit,
694 bool outOfOrder,
695 boost::asio::yield_context yield
696 );
697
706 std::optional<LedgerObject>
708 xrpl::uint256 key,
709 std::uint32_t ledgerSequence,
710 boost::asio::yield_context yield
711 ) const;
712
725 std::optional<xrpl::uint256>
727 xrpl::uint256 key,
728 std::uint32_t ledgerSequence,
729 boost::asio::yield_context yield
730 ) const;
731
740 virtual std::optional<xrpl::uint256>
742 xrpl::uint256 key,
743 std::uint32_t ledgerSequence,
744 boost::asio::yield_context yield
745 ) const = 0;
746
758 xrpl::uint256 const& book,
759 std::uint32_t ledgerSequence,
760 std::uint32_t limit,
761 boost::asio::yield_context yield
762 ) const;
763
771 virtual std::optional<std::string>
773 std::string const& migratorName,
774 boost::asio::yield_context yield
775 ) const = 0;
776
781 std::expected<std::vector<std::pair<boost::uuids::uuid, std::string>>, std::string>;
782
789 [[nodiscard]] virtual ClioNodesDataFetchResult
790 fetchClioNodesData(boost::asio::yield_context yield) const = 0;
791
800 std::optional<LedgerRange>
801 hardFetchLedgerRange() const;
802
809 virtual std::optional<LedgerRange>
810 hardFetchLedgerRange(boost::asio::yield_context yield) const = 0;
811
817 std::optional<LedgerRange>
819
826 virtual void
827 writeLedger(xrpl::LedgerHeader const& ledgerHeader, std::string&& blob) = 0;
828
836 virtual void
837 writeLedgerObject(std::string&& key, std::uint32_t seq, std::string&& blob);
838
848 virtual void
850 std::string&& hash,
851 std::uint32_t seq,
852 std::uint32_t date,
853 std::string&& transaction,
854 std::string&& metadata
855 ) = 0;
856
862 virtual void
863 writeNFTs(std::vector<NFTsData> const& data) = 0;
864
870 virtual void
871 writeAccountTransactions(std::vector<AccountTransactionsData> data) = 0;
872
878 virtual void
880
886 virtual void
887 writeNFTTransactions(std::vector<NFTTransactionsData> const& data) = 0;
888
895 virtual void
896 writeMPTokenIssuanceTransactions(std::vector<MPTokenIssuanceTransactionsData> const& data) = 0;
897
906 virtual void
908 std::vector<MPTokenIssuanceTransactionsData> const& data
909 ) = 0;
910
916 virtual void
917 writeMPTHolders(std::vector<MPTHolderData> const& data) = 0;
918
926 virtual void
927 writeSuccessor(std::string&& key, std::uint32_t seq, std::string&& successor) = 0;
928
935 virtual void
936 writeNodeMessage(boost::uuids::uuid const& uuid, std::string message) = 0;
937
943 virtual void
944 startWrites() const = 0;
945
954 bool
955 finishWrites(std::uint32_t ledgerSequence);
956
960 virtual void
962
969 virtual void
970 writeMigratorStatus(std::string const& migratorName, std::string const& status) = 0;
971
975 virtual bool
976 isTooBusy() const = 0;
977
981 virtual boost::json::object
982 stats() const = 0;
983
984private:
992 virtual void
993 doWriteLedgerObject(std::string&& key, std::uint32_t seq, std::string&& blob) = 0;
994
1000 virtual bool
1001 doFinishWrites() = 0;
1002
1003 void
1004 updateRangeImpl(uint32_t newMax);
1005};
1006
1007} // namespace data
1008using BackendInterface = data::BackendInterface;
The interface to the database used by Clio.
Definition BackendInterface.hpp:211
virtual MPTHoldersAndCursor fetchMPTHolders(xrpl::uint192 const &mptID, std::uint32_t const limit, std::optional< xrpl::AccountID > const &cursorIn, std::uint32_t const ledgerSequence, boost::asio::yield_context yield) const =0
Fetches all holders' balances for a MPTIssuanceID.
virtual std::vector< TransactionAndMetadata > fetchTransactions(std::vector< xrpl::uint256 > const &hashes, boost::asio::yield_context yield) const =0
Fetches multiple transactions.
std::optional< LedgerObject > fetchSuccessorObject(xrpl::uint256 key, std::uint32_t ledgerSequence, boost::asio::yield_context yield) const
Fetches the successor object.
Definition BackendInterface.cpp:146
std::optional< std::uint32_t > fetchLedgerObjectSeq(xrpl::uint256 const &key, std::uint32_t sequence, boost::asio::yield_context yield) const
Fetches a specific ledger object sequence.
Definition BackendInterface.cpp:82
virtual std::vector< TransactionAndMetadata > fetchAllTransactionsInLedger(std::uint32_t ledgerSequence, boost::asio::yield_context yield) const =0
Fetches all transactions from a specific ledger.
virtual void writeNodeMessage(boost::uuids::uuid const &uuid, std::string message)=0
Write a node message. Used by ClusterCommunicationService.
virtual bool isTooBusy() const =0
virtual ClioNodesDataFetchResult fetchClioNodesData(boost::asio::yield_context yield) const =0
Fetches the data of all nodes in the cluster.
void forceUpdateRange(uint32_t newMax)
Updates the range of sequences that are stored in the DB without any checks.
Definition BackendInterface.cpp:277
virtual std::optional< xrpl::LedgerHeader > fetchLedgerByHash(xrpl::uint256 const &hash, boost::asio::yield_context yield) const =0
Fetches a specific ledger by hash.
std::expected< std::vector< std::pair< boost::uuids::uuid, std::string > >, std::string > ClioNodesDataFetchResult
Return type for fetchClioNodesData() method.
Definition BackendInterface.hpp:780
virtual void writeNFTs(std::vector< NFTsData > const &data)=0
Writes NFTs to the database.
virtual std::optional< std::uint32_t > doFetchLedgerObjectSeq(xrpl::uint256 const &key, std::uint32_t sequence, boost::asio::yield_context yield) const =0
The database-specific implementation for fetching a ledger object sequence.
void setRange(uint32_t min, uint32_t max, bool force=false)
Sets the range of sequences that are stored in the DB.
Definition BackendInterface.cpp:284
LedgerCacheInterface & cache()
Definition BackendInterface.hpp:265
virtual std::optional< xrpl::LedgerHeader > fetchLedgerBySequence(std::uint32_t sequence, boost::asio::yield_context yield) const =0
Fetches a specific ledger by sequence number.
virtual std::optional< NFT > fetchNFT(xrpl::uint256 const &tokenID, std::uint32_t ledgerSequence, boost::asio::yield_context yield) const =0
Fetches a specific NFT.
virtual void startWrites() const =0
Starts a write transaction with the DB. No-op for cassandra.
virtual TransactionsAndCursor fetchNFTTransactions(xrpl::uint256 const &tokenID, std::uint32_t limit, bool forward, std::optional< TransactionsCursor > const &cursorIn, boost::asio::yield_context yield) const =0
Fetches all transactions for a specific NFT.
std::optional< xrpl::uint256 > fetchSuccessorKey(xrpl::uint256 key, std::uint32_t ledgerSequence, boost::asio::yield_context yield) const
Fetches the successor key.
Definition BackendInterface.cpp:130
virtual void writeLedger(xrpl::LedgerHeader const &ledgerHeader, std::string &&blob)=0
Writes to a specific ledger.
std::optional< Blob > fetchLedgerObject(xrpl::uint256 const &key, std::uint32_t sequence, boost::asio::yield_context yield) const
Fetches a specific ledger object.
Definition BackendInterface.cpp:60
virtual TransactionsAndCursor fetchMPTokenIssuanceTransactions(xrpl::uint192 const &mptIssuanceID, std::uint32_t limit, bool forward, std::optional< TransactionsCursor > const &cursorIn, boost::asio::yield_context yield) const =0
Fetches transactions for a particular MPTokenIssuance ID.
std::optional< xrpl::Fees > fetchFees(std::uint32_t seq, boost::asio::yield_context yield) const
Fetch the fees from a specific ledger sequence.
Definition BackendInterface.cpp:352
virtual std::optional< LedgerRange > hardFetchLedgerRange(boost::asio::yield_context yield) const =0
Fetches the ledger range from DB.
virtual void writeLedgerObject(std::string &&key, std::uint32_t seq, std::string &&blob)
Writes a new ledger object.
Definition BackendInterface.cpp:46
virtual void writeSuccessor(std::string &&key, std::uint32_t seq, std::string &&successor)=0
Write a new successor.
virtual TransactionsAndCursor fetchAccountTransactions(xrpl::AccountID const &account, std::uint32_t limit, bool forward, std::optional< TransactionsCursor > const &txnCursor, boost::asio::yield_context yield) const =0
Fetches all transactions for a specific account.
virtual std::optional< std::string > fetchMigratorStatus(std::string const &migratorName, boost::asio::yield_context yield) const =0
Fetches the status of migrator by name.
virtual void waitForWritesToFinish()=0
Wait for all pending writes to finish.
std::optional< LedgerRange > hardFetchLedgerRange() const
Synchronously fetches the ledger range from DB.
Definition BackendInterface.cpp:245
BackendInterface(LedgerCacheInterface &cache)
Construct a new backend interface instance.
Definition BackendInterface.hpp:225
virtual void writeAccountTransaction(AccountTransactionsData record)=0
Write a new account transaction.
std::optional< LedgerRange > hardFetchLedgerRangeNoThrow() const
Fetches the ledger range from DB retrying until no DatabaseError is thrown.
Definition BackendInterface.cpp:53
virtual void writeNFTTransactions(std::vector< NFTTransactionsData > const &data)=0
Write NFTs transactions.
std::optional< LedgerRange > fetchLedgerRange() const
Fetch the current ledger range.
Definition BackendInterface.cpp:251
virtual void writeTransaction(std::string &&hash, std::uint32_t seq, std::uint32_t date, std::string &&transaction, std::string &&metadata)=0
Writes a new transaction.
bool finishWrites(std::uint32_t ledgerSequence)
Tells database we finished writing all data for a specific ledger.
Definition BackendInterface.cpp:35
virtual boost::json::object stats() const =0
virtual TransactionsAndCursor fetchAccountMPTokenIssuanceTransactions(xrpl::uint192 const &mptIssuanceID, xrpl::AccountID const &account, std::uint32_t limit, bool forward, std::optional< TransactionsCursor > const &cursorIn, boost::asio::yield_context yield) const =0
Fetches transactions for a particular MPTokenIssuance ID involving a particular account.
void setCorruptionDetector(etl::CorruptionDetector detector)
Sets the corruption detector.
Definition BackendInterface.hpp:276
virtual std::chrono::milliseconds maxRetryDelay() const
Definition BackendInterface.hpp:244
virtual std::optional< std::uint32_t > fetchLatestLedgerSequence(boost::asio::yield_context yield) const =0
Fetches the latest ledger sequence.
virtual std::vector< xrpl::uint256 > fetchAccountRoots(std::uint32_t number, std::uint32_t pageSize, std::uint32_t seq, boost::asio::yield_context yield) const =0
Fetch the specified number of account root object indexes by page, the accounts need to exist for seq...
virtual void writeAccountTransactions(std::vector< AccountTransactionsData > data)=0
Write a new set of account transactions.
virtual std::vector< Blob > doFetchLedgerObjects(std::vector< xrpl::uint256 > const &keys, std::uint32_t sequence, boost::asio::yield_context yield) const =0
The database-specific implementation for fetching ledger objects.
virtual void writeMigratorStatus(std::string const &migratorName, std::string const &status)=0
Mark the migration status of a migrator as Migrated in the database.
virtual void writeMPTHolders(std::vector< MPTHolderData > const &data)=0
Write accounts that started holding onto a MPT.
virtual std::chrono::milliseconds initialRetryDelay() const
Definition BackendInterface.hpp:235
virtual std::vector< LedgerObject > fetchLedgerDiff(std::uint32_t ledgerSequence, boost::asio::yield_context yield) const =0
Returns the difference between ledgers.
virtual void writeAccountMPTokenIssuanceTransactions(std::vector< MPTokenIssuanceTransactionsData > const &data)=0
Write MPTokenIssuance transaction index rows to the account_mptoken_issuance_transactions table.
BookOffersPage fetchBookOffers(xrpl::uint256 const &book, std::uint32_t ledgerSequence, std::uint32_t limit, boost::asio::yield_context yield) const
Fetches book offers.
Definition BackendInterface.cpp:164
virtual std::optional< Blob > doFetchLedgerObject(xrpl::uint256 const &key, std::uint32_t sequence, boost::asio::yield_context yield) const =0
The database-specific implementation for fetching a ledger object.
virtual std::vector< xrpl::uint256 > fetchAllTransactionHashesInLedger(std::uint32_t ledgerSequence, boost::asio::yield_context yield) const =0
Fetches all transaction hashes from a specific ledger.
virtual NFTsAndCursor fetchNFTsByIssuer(xrpl::AccountID const &issuer, std::optional< std::uint32_t > const &taxon, std::uint32_t ledgerSequence, std::uint32_t limit, std::optional< xrpl::uint256 > const &cursorIn, boost::asio::yield_context yield) const =0
Fetches all NFTs issued by a given address.
std::vector< Blob > fetchLedgerObjects(std::vector< xrpl::uint256 > const &keys, std::uint32_t sequence, boost::asio::yield_context yield) const
Fetches all ledger objects by their keys.
Definition BackendInterface.cpp:95
virtual std::optional< TransactionAndMetadata > fetchTransaction(xrpl::uint256 const &hash, boost::asio::yield_context yield) const =0
Fetches a specific transaction.
void updateRange(uint32_t newMax)
Updates the range of sequences that are stored in the DB.
Definition BackendInterface.cpp:258
virtual std::optional< xrpl::uint256 > doFetchSuccessorKey(xrpl::uint256 key, std::uint32_t ledgerSequence, boost::asio::yield_context yield) const =0
Database-specific implementation of fetching the successor key.
virtual void writeMPTokenIssuanceTransactions(std::vector< MPTokenIssuanceTransactionsData > const &data)=0
Write MPTokenIssuance transaction index rows to the mptoken_issuance_transactions table.
LedgerCacheInterface const & cache() const
Definition BackendInterface.hpp:256
LedgerPage fetchLedgerPage(std::optional< xrpl::uint256 > const &cursor, std::uint32_t ledgerSequence, std::uint32_t limit, bool outOfOrder, boost::asio::yield_context yield)
Fetches a page of ledger objects, ordered by key/index.
Definition BackendInterface.cpp:297
Represents a transient database error that the caller should retry.
Definition BackendInterface.hpp:41
char const * what() const noexcept override
Definition BackendInterface.hpp:60
DatabaseError(std::string message)
Construct with a description of the underlying failure.
Definition BackendInterface.hpp:52
Cache for an entire ledger.
Definition LedgerCacheInterface.hpp:21
A helper to notify Clio operator about a corruption in the DB.
Definition CorruptionDetector.hpp:16
A retry strategy that retries while exponentially increasing the delay between attempts.
Definition Retry.hpp:169
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:78
Pump error(std::source_location const &loc=std::source_location::current()) const
Interface for logging at Severity::ERR severity.
Definition Logger.cpp:512
std::chrono::steady_clock::duration getDelay() const
Definition Retry.cpp:25
void increaseDelay()
Increase the delay value.
Definition Retry.cpp:31
This namespace implements the data access layer and related components.
Definition AmendmentCenter.cpp:56
auto synchronous(FnType &&func)
Synchronously executes the given function object inside a coroutine.
Definition BackendInterface.hpp:169
static constexpr std::chrono::milliseconds kDefaultWaitBetweenRetry
Delay before the first retry in retryOnTimeout().
Definition BackendInterface.hpp:69
auto synchronousAndRetryOnTimeout(FnType &&func, util::Retry::Delays delays=kDefaultRetryDelays)
Synchronously execute the given function object and retry until no DatabaseError is thrown.
Definition BackendInterface.hpp:203
static constexpr util::Retry::Delays kDefaultRetryDelays
Default delays for retryOnTimeout().
Definition BackendInterface.hpp:79
static constexpr std::chrono::milliseconds kMaxWaitBetweenRetry
Default upper bound for the exponential backoff in retryOnTimeout().
Definition BackendInterface.hpp:74
auto retryOnTimeout(FnType func, boost::asio::yield_context yield, util::Retry::Delays delays=kDefaultRetryDelays)
Retry func while it throws DatabaseError, suspending the calling coroutine in between.
Definition BackendInterface.hpp:95
Retry makeRetryExponentialBackoff(Retry::Delays delays, boost::asio::strand< boost::asio::io_context::executor_type > strand)
Create a retry mechanism with exponential backoff strategy.
Definition Retry.cpp:120
void spawn(Ctx &&ctx, F &&func)
Spawns a coroutine using boost::asio::spawn.
Definition Spawn.hpp:53
Struct used to keep track of what to write to account_transactions/account_tx tables.
Definition DBHelpers.hpp:26
Represents a page of book offer objects.
Definition Types.hpp:41
Represents a page of LedgerObjects.
Definition Types.hpp:33
Represents an array of MPTokens.
Definition Types.hpp:235
Represents a bundle of NFTs with a cursor to the next page.
Definition Types.hpp:227
Represests a bundle of transactions with metadata and a cursor to the next page.
Definition Types.hpp:153
The delays to use between retry attempts.
Definition Retry.hpp:75