));
}
-inline std::vector<ceph::libfdb::select> locate_split_points(
+inline std::vector<ceph::libfdb::select> plan_split_ranges(
ceph::libfdb::database_handle dbh,
ceph::libfdb::select selector,
const std::int64_t remote_chunk_size)
// 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<AssocT>();
+ });
+ };
- co_yield block;
- }
+ co_yield std::ranges::elements_of(split_ranges | std::views::transform(read_block));
}
} // namespace ceph::libfdb
auto tier_generator(ceph::libfdb::database_handle dbh, ceph::libfdb::select selector)
-> std::generator<AssocT>
{
- 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) {