41 std::shared_ptr<BackendInterface> backend_;
46 : backend_{backend}, numCursors_{numCursors}
50 [[nodiscard]] std::vector<CursorPair>
51 getCursors(uint32_t
const seq)
const override
53 namespace rg = std::ranges;
54 namespace vs = std::views;
56 auto const fetchDiff = [
this, seq](uint32_t offset) {
58 return backend_->fetchLedgerDiff(seq - offset, yield);
62 auto const range = backend_->fetchLedgerRange();
63 ASSERT(range.has_value(),
"Ledger range is not available when cache is loading");
65 std::set<ripple::uint256> liveCursors;
66 std::set<ripple::uint256> deletedCursors;
68 while (liveCursors.size() < numCursors_ and seq - i >= range->minSequence) {
69 auto diffs = fetchDiff(i++);
72 | vs::filter([&deletedCursors](
auto const& obj) {
73 return not obj.blob.empty() and !deletedCursors.contains(obj.key);
75 | vs::transform([](
auto const& obj) {
return obj.key; }),
76 std::inserter(liveCursors, std::begin(liveCursors))
82 | vs::filter([](
auto const& obj) {
return obj.blob.empty(); })
83 | vs::transform([](
auto const& obj) {
return obj.key; }),
84 std::inserter(deletedCursors, std::begin(deletedCursors))
88 std::vector<ripple::uint256> cursors{data::kFIRST_KEY};
89 rg::copy(liveCursors | vs::take(std::min(liveCursors.size(), numCursors_)), std::back_inserter(cursors));
91 cursors.push_back(data::kLAST_KEY);
93 std::vector<CursorPair> pairs;
94 pairs.reserve(cursors.size());
99 std::prev(std::end(cursors)),
100 std::next(std::begin(cursors)),
101 std::back_inserter(pairs),
102 [](
auto&& a,
auto&& b) ->
CursorPair {
return {a, b}; }
auto synchronousAndRetryOnTimeout(FnType &&func)
Synchronously execute the given function object and retry until no DatabaseTimeout is thrown.
Definition BackendInterface.hpp:130