});
}
+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,
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, list<extent, extent_info>>
+ * 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<std::pair<paddr_t, extent_info_t>>
+ >;
+ using scan_extents_ret = scan_extents_ertr::future<scan_extents_ret_bare>;
+ 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;
* 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<paddr_t>;