From f393f3a585e74621194253630e89b2a2762d96fe Mon Sep 17 00:00:00 2001 From: "Jesse F. Williamson" Date: Tue, 14 Jul 2026 12:29:05 -0700 Subject: [PATCH] Tweak block_generator<> to use transactors! A pleasant improvement to the implementation. Signed-off-by: Jesse F. Williamson --- src/rgw/fdb/base.h | 2 +- src/rgw/fdb/interface.h | 16 +++++++--------- src/test/rgw/test_fdb_ceph.cc | 4 ++-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/rgw/fdb/base.h b/src/rgw/fdb/base.h index 3efaad24b03..877fce14778 100644 --- a/src/rgw/fdb/base.h +++ b/src/rgw/fdb/base.h @@ -811,7 +811,7 @@ inline future_value get_range_future_from_transaction(ceph::libfdb::transaction& )); } -inline std::vector locate_split_points( +inline std::vector plan_split_ranges( ceph::libfdb::database_handle dbh, ceph::libfdb::select selector, const std::int64_t remote_chunk_size) diff --git a/src/rgw/fdb/interface.h b/src/rgw/fdb/interface.h index c06d65dab07..eb1059da87a 100644 --- a/src/rgw/fdb/interface.h +++ b/src/rgw/fdb/interface.h @@ -475,17 +475,15 @@ auto block_generator(ceph::libfdb::database_handle dbh, ceph::libfdb::select sel // we need real-world experience to tweak this further): const auto chunk_size = 4*(1024*1024); - auto split_points = detail::locate_split_points(dbh, selector, chunk_size); + auto split_ranges = detail::plan_split_ranges(dbh, selector, chunk_size); - // This can be paralellized, but early benchmarks didn't show it helping: - for (const auto& sp : split_points) { - AssocT block; - for (auto&& p : pair_generator(dbh, sp)) { - block.emplace(std::move(p)); - } + auto read_block = [txr = make_transactor(dbh)](const auto& range) { + return txr([&range](auto& txn) { + return pair_generator(txn, range) | std::ranges::to(); + }); + }; - co_yield block; - } + co_yield std::ranges::elements_of(split_ranges | std::views::transform(read_block)); } } // namespace ceph::libfdb diff --git a/src/test/rgw/test_fdb_ceph.cc b/src/test/rgw/test_fdb_ceph.cc index c9b5705c7c2..25791d43dae 100644 --- a/src/test/rgw/test_fdb_ceph.cc +++ b/src/test/rgw/test_fdb_ceph.cc @@ -313,11 +313,11 @@ template auto tier_generator(ceph::libfdb::database_handle dbh, ceph::libfdb::select selector) -> std::generator { - auto split_points = locate_split_points(dbh, selector); + auto split_ranges = plan_split_ranges(dbh, selector); const unsigned local_max_block = 2*2024; // vis-a-vis remote request max - std::transform_reduce(std::begin(split_points), std::end(split_points), + std::transform_reduce(std::begin(split_ranges), std::end(split_ranges), AssocT(), [](auto&& lhs, auto&& rhs) { -- 2.47.3