]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: use scan_segment to add extent scan
authorSamuel Just <sjust@redhat.com>
Fri, 4 Sep 2020 07:46:40 +0000 (00:46 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h

index 1b6578c93b471da48044c9a3db292d6e12b8e34c..4f4d1fc5f5bf3cad16c92aa9f90b189853cc4d62 100644 (file)
@@ -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,
index bedfa3ab5638db92714d50c1afc642bff77575af..f4ada3499c1ee08e95c4ad059abe2b1dec6910bc 100644 (file)
@@ -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, 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;
@@ -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<paddr_t>;