22 std::shared_ptr<BackendInterface> backend_;
26 CursorFromDiffProvider(std::shared_ptr<BackendInterface> backend,
size_t numCursors)
27 : backend_{std::move(backend)}, numCursors_{numCursors}
31 [[nodiscard]] std::vector<CursorPair>
32 getCursors(uint32_t
const seq)
const override
34 namespace rg = std::ranges;
35 namespace vs = std::views;
37 auto const fetchDiff = [
this, seq](uint32_t offset) {
39 return backend_->fetchLedgerDiff(seq - offset, yield);
43 auto const range = backend_->fetchLedgerRange();
44 ASSERT(range.has_value(),
"Ledger range is not available when cache is loading");
46 std::set<ripple::uint256> liveCursors;
47 std::set<ripple::uint256> deletedCursors;
49 while (liveCursors.size() < numCursors_ and seq - i >= range->minSequence) {
50 auto diffs = fetchDiff(i++);
53 | vs::filter([&deletedCursors](
auto const& obj) {
54 return not obj.blob.empty() and !deletedCursors.contains(obj.key);
56 | vs::transform([](
auto const& obj) {
return obj.key; }),
57 std::inserter(liveCursors, std::begin(liveCursors))
63 | vs::filter([](
auto const& obj) {
return obj.blob.empty(); })
64 | vs::transform([](
auto const& obj) {
return obj.key; }),
65 std::inserter(deletedCursors, std::begin(deletedCursors))
69 std::vector<ripple::uint256> cursors{data::kFIRST_KEY};
71 liveCursors | vs::take(std::min(liveCursors.size(), numCursors_)),
72 std::back_inserter(cursors)
75 cursors.push_back(data::kLAST_KEY);
77 std::vector<CursorPair> pairs;
78 pairs.reserve(cursors.size());
83 std::prev(std::end(cursors)),
84 std::next(std::begin(cursors)),
85 std::back_inserter(pairs),
86 [](
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:117