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;
50 while (liveCursors.size() < numCursors_ and seq - i >= range->minSequence) {
51 auto diffs = fetchDiff(i++);
54 | vs::filter([&deletedCursors](
auto const& obj) {
55 return not obj.blob.empty() and !deletedCursors.contains(obj.key);
57 | vs::transform([](
auto const& obj) {
return obj.key; }),
58 std::inserter(liveCursors, std::begin(liveCursors))
64 | vs::filter([](
auto const& obj) {
return obj.blob.empty(); })
65 | vs::transform([](
auto const& obj) {
return obj.key; }),
66 std::inserter(deletedCursors, std::begin(deletedCursors))
70 std::vector<ripple::uint256> cursors{data::kFirstKey};
72 liveCursors | vs::take(std::min(liveCursors.size(), numCursors_)),
73 std::back_inserter(cursors)
76 cursors.push_back(data::kLastKey);
78 std::vector<CursorPair> pairs;
79 pairs.reserve(cursors.size());
84 std::prev(std::end(cursors)),
85 std::next(std::begin(cursors)),
86 std::back_inserter(pairs),
87 [](
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