From 820383ce4a3e3c41b4b857303b2a088abec5b7f0 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 4 Sep 2020 00:46:40 -0700 Subject: [PATCH] crimson/os/seastore/journal: use scan_segment to add extent scan Signed-off-by: Samuel Just --- src/crimson/os/seastore/journal.cc | 28 ++++++++++++++++++++++++++++ src/crimson/os/seastore/journal.h | 24 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 1b6578c93b471..4f4d1fc5f5bf3 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -396,6 +396,34 @@ Journal::replay_ret Journal::replay(delta_handler_t &&delta_handler) }); } +Journal::scan_extents_ret Journal::scan_extents( + paddr_t addr, + extent_len_t bytes_to_read) +{ + // Caller doesn't know addr of first record, so addr.offset == 0 is special + if (addr.offset == 0) addr.offset = block_size; + + return seastar::do_with( + scan_extents_ret_bare(), + [=](auto &ret) { + return seastar::do_with( + extent_handler_t([&ret](auto addr, const auto &info) mutable { + ret.second.push_back(std::make_pair(addr, info)); + return scan_extents_ertr::now(); + }), + [=, &ret](auto &handler) mutable { + return scan_segment( + addr, + bytes_to_read, + nullptr, + &handler).safe_then([&ret](auto next) mutable { + ret.first = next; + return std::move(ret); + }); + }); + }); +} + Journal::scan_segment_ret Journal::scan_segment( paddr_t addr, extent_len_t bytes_to_read, diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index bedfa3ab5638d..f4ada3499c1ee 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -190,6 +190,28 @@ public: const delta_info_t&)>; replay_ret replay(delta_handler_t &&delta_handler); + /** + * scan_extents + * + * Scans records beginning at addr until the first record boundary after + * addr + bytes_to_read. + * + * Returns > + * next_addr will be P_ADDR_NULL if no further extents exist in segment. + * If addr.offset == 0, scan will adjust to first record in segment. + */ + using scan_extents_ertr = SegmentManager::read_ertr; + using scan_extents_ret_bare = std::pair< + paddr_t, + std::list> + >; + using scan_extents_ret = scan_extents_ertr::future; + scan_extents_ret scan_extents( + paddr_t addr, + extent_len_t bytes_to_read + ); + + private: const extent_len_t block_size; const extent_len_t max_record_length; @@ -285,6 +307,8 @@ private: * addr+bytes_to_read invoking delta_handler and extent_info_handler * on deltas and extent_infos respectively. deltas, extent_infos * will only be decoded if the corresponding handler is included. + * + * @return next address to read from, P_ADDR_NULL if segment complete */ using scan_segment_ertr = SegmentManager::read_ertr; using scan_segment_ret = scan_segment_ertr::future; -- 2.39.5