]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba_manager: add scan_mappings
authorSamuel Just <sjust@redhat.com>
Fri, 17 Jul 2020 23:21:30 +0000 (16:21 -0700)
committerSamuel Just <sjust@redhat.com>
Mon, 19 Oct 2020 22:18:14 +0000 (15:18 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h
src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc
src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_transaction_manager.cc

index fa897a27779085cafa06dbb7203c4b4804380caa..245e7e08c3a0741940fddf17f4510a32611a8f59 100644 (file)
@@ -135,6 +135,29 @@ public:
     Transaction &t,
     CachedExtentRef e) = 0;
 
+  /**
+   * Calls f for each mapping in [begin, end)
+   */
+  using scan_mappings_ertr = SegmentManager::read_ertr;
+  using scan_mappings_ret = scan_mappings_ertr::future<>;
+  using scan_mappings_func_t = std::function<
+    void(laddr_t, paddr_t, extent_len_t)>;
+  virtual scan_mappings_ret scan_mappings(
+    Transaction &t,
+    laddr_t begin,
+    laddr_t end,
+    scan_mappings_func_t &&f) = 0;
+
+  /**
+   * Calls f for each mapped space usage in [begin, end)
+   */
+  using scan_mapped_space_ertr = SegmentManager::read_ertr;
+  using scan_mapped_space_ret = scan_mapped_space_ertr::future<>;
+  using scan_mapped_space_func_t = std::function<
+    void(paddr_t, extent_len_t)>;
+  virtual scan_mapped_space_ret scan_mapped_space(
+    Transaction &t,
+    scan_mapped_space_func_t &&f) = 0;
 
   /**
    * rewrite_extent
@@ -148,7 +171,6 @@ public:
     Transaction &t,
     CachedExtentRef extent) = 0;
 
-
   virtual void add_pin(LBAPin &pin) = 0;
 
   virtual ~LBAManager() {}
index f16731dc1df6682cc42a9a7a12e5ad10900b8c17..a49f7dbde3c3a936276f83581c923a8f61e04c3a 100644 (file)
@@ -293,6 +293,42 @@ BtreeLBAManager::init_cached_extent_ret BtreeLBAManager::init_cached_extent(
     });
 }
 
+BtreeLBAManager::scan_mappings_ret BtreeLBAManager::scan_mappings(
+  Transaction &t,
+  laddr_t begin,
+  laddr_t end,
+  scan_mappings_func_t &&f)
+{
+  return seastar::do_with(
+    std::move(f),
+    [=, &t](auto &f) {
+      return get_root(t).safe_then(
+       [=, &t, &f](LBANodeRef lbaroot) mutable {
+         return lbaroot->scan_mappings(
+           get_context(t),
+           begin,
+           end,
+           f);
+       });
+    });
+}
+
+BtreeLBAManager::scan_mapped_space_ret BtreeLBAManager::scan_mapped_space(
+    Transaction &t,
+    scan_mapped_space_func_t &&f)
+{
+  return seastar::do_with(
+    std::move(f),
+    [=, &t](auto &f) {
+      return get_root(t).safe_then(
+       [=, &t, &f](LBANodeRef lbaroot) mutable {
+         return lbaroot->scan_mapped_space(
+           get_context(t),
+           f);
+       });
+    });
+}
+
 BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
   Transaction &t,
   CachedExtentRef extent)
index 1dec91c9c15dfc7b667123e4761181198526e621..8287cfac2797e44614d5c421de6ba27ef46bcc12 100644 (file)
@@ -87,6 +87,16 @@ public:
     Transaction &t,
     CachedExtentRef e) final;
 
+  scan_mappings_ret scan_mappings(
+    Transaction &t,
+    laddr_t begin,
+    laddr_t end,
+    scan_mappings_func_t &&f) final;
+
+  scan_mapped_space_ret scan_mapped_space(
+    Transaction &t,
+    scan_mapped_space_func_t &&f) final;
+
   rewrite_extent_ret rewrite_extent(
     Transaction &t,
     CachedExtentRef extent);
index 852e989818c2d6a81e9a1b52e50ce152bc8c9d67..040bcc49344930a98e6028526d5921b6c35ad4e5 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "crimson/common/log.h"
 #include "crimson/os/seastore/lba_manager/btree/btree_range_pin.h"
+#include "crimson/os/seastore/lba_manager.h"
 
 namespace crimson::os::seastore::lba_manager::btree {
 
@@ -115,6 +116,27 @@ struct LBANode : CachedExtent {
     laddr_t max,
     extent_len_t len) = 0;
 
+  /**
+   * scan_mappings
+   *
+   * Call f for all mappings in [begin, end)
+   */
+  using scan_mappings_ertr = LBAManager::scan_mappings_ertr;
+  using scan_mappings_ret = LBAManager::scan_mappings_ret;
+  using scan_mappings_func_t = LBAManager::scan_mappings_func_t;
+  virtual scan_mappings_ret scan_mappings(
+    op_context_t c,
+    laddr_t begin,
+    laddr_t end,
+    scan_mappings_func_t &f) = 0;
+
+  using scan_mapped_space_ertr = LBAManager::scan_mapped_space_ertr;
+  using scan_mapped_space_ret = LBAManager::scan_mapped_space_ret;
+  using scan_mapped_space_func_t = LBAManager::scan_mapped_space_func_t;
+  virtual scan_mapped_space_ret scan_mapped_space(
+    op_context_t c,
+    scan_mapped_space_func_t &f) = 0;
+
   /**
    * mutate_mapping
    *
index 07a7b4f2e9ab87fe43dbe7a12d0d5218f201d0dc..4738ae6849ab34c17c932e8ac1f069aaec72dc1d 100644 (file)
@@ -232,6 +232,46 @@ LBAInternalNode::find_hole_ret LBAInternalNode::find_hole(
     });
 }
 
+LBAInternalNode::scan_mappings_ret LBAInternalNode::scan_mappings(
+  op_context_t c,
+  laddr_t begin,
+  laddr_t end,
+  scan_mappings_func_t &f)
+{
+  auto [biter, eiter] = bound(begin, end);
+  return crimson::do_for_each(
+    std::move(biter),
+    std::move(eiter),
+    [=, &f](auto &viter) {
+      return get_lba_btree_extent(
+       c,
+       get_meta().depth - 1,
+       viter->get_val(),
+       get_paddr()).safe_then([=, &f](auto child) {
+         return child->scan_mappings(c, begin, end, f);
+       });
+    });
+}
+
+LBAInternalNode::scan_mapped_space_ret LBAInternalNode::scan_mapped_space(
+  op_context_t c,
+  scan_mapped_space_func_t &f)
+{
+  f(get_paddr(), get_length());
+  return crimson::do_for_each(
+    std::move(begin()),
+    std::move(end()),
+    [=, &f](auto &viter) {
+      return get_lba_btree_extent(
+       c,
+       get_meta().depth - 1,
+       viter->get_val(),
+       get_paddr()).safe_then([=, &f](auto child) {
+         return child->scan_mapped_space(c, f);
+       });
+    });
+}
+
 
 void LBAInternalNode::resolve_relative_addrs(paddr_t base) {
   for (auto i: *this) {
@@ -524,6 +564,33 @@ LBALeafNode::find_hole_ret LBALeafNode::find_hole(
   }
 }
 
+LBALeafNode::scan_mappings_ret LBALeafNode::scan_mappings(
+  op_context_t c,
+  laddr_t begin,
+  laddr_t end,
+  scan_mappings_func_t &f)
+{
+  auto [biter, eiter] = bound(begin, end);
+  for (auto i = biter; i != eiter; ++i) {
+    auto val = i->get_val();
+    f(i->get_key(), val.paddr, val.len);
+  }
+  return scan_mappings_ertr::now();
+}
+
+LBALeafNode::scan_mapped_space_ret LBALeafNode::scan_mapped_space(
+  op_context_t c,
+  scan_mapped_space_func_t &f)
+{
+  f(get_paddr(), get_length());
+  for (auto i = begin(); i != end(); ++i) {
+    auto val = i->get_val();
+    f(val.paddr, val.len);
+  }
+  return scan_mappings_ertr::now();
+}
+
+
 void LBALeafNode::resolve_relative_addrs(paddr_t base) {
   for (auto i: *this) {
     if (i->get_val().paddr.is_relative()) {
index dbdf62e35b19857be7df0331009b31b4ac3a3ae1..da94313758fcb74ed4e082d33905882ee0deb0d8 100644 (file)
@@ -121,6 +121,16 @@ struct LBAInternalNode
     laddr_t max,
     extent_len_t len) final;
 
+  scan_mappings_ret scan_mappings(
+    op_context_t c,
+    laddr_t begin,
+    laddr_t end,
+    scan_mappings_func_t &f) final;
+
+  scan_mapped_space_ret scan_mapped_space(
+    op_context_t c,
+    scan_mapped_space_func_t &f) final;
+
   std::tuple<LBANodeRef, LBANodeRef, laddr_t>
   make_split_children(op_context_t c) final {
     auto left = c.cache.alloc_new_extent<LBAInternalNode>(
@@ -366,6 +376,16 @@ struct LBALeafNode
     laddr_t max,
     extent_len_t len) final;
 
+  scan_mappings_ret scan_mappings(
+    op_context_t c,
+    laddr_t begin,
+    laddr_t end,
+    scan_mappings_func_t &f) final;
+
+  scan_mapped_space_ret scan_mapped_space(
+    op_context_t c,
+    scan_mapped_space_func_t &f) final;
+
   std::tuple<LBANodeRef, LBANodeRef, laddr_t>
   make_split_children(op_context_t c) final {
     auto left = c.cache.alloc_new_extent<LBALeafNode>(
index 3b58a0ccacef980017f5f3163b2652a716bee58f..8740d62a71099478a034845d222ce8b954dc7875 100644 (file)
@@ -261,6 +261,17 @@ struct btree_lba_manager_test :
       EXPECT_EQ(i.first, ret->get_laddr());
       EXPECT_EQ(i.second.len, ret->get_length());
     }
+    lba_manager->scan_mappings(
+      *t.t,
+      0,
+      L_ADDR_MAX,
+      [iter=t.mappings.begin(), &t](auto l, auto p, auto len) mutable {
+       EXPECT_NE(iter, t.mappings.end());
+       EXPECT_EQ(l, iter->first);
+       EXPECT_EQ(p, iter->second.addr);
+       EXPECT_EQ(len, iter->second.len);
+       ++iter;
+      }).unsafe_get();
   }
 };
 
index 843618fb303cbff3cb0f93a6ea10ae2f967753fe..6e7a80942db8097e49e2d965e12e8a14e226dc19 100644 (file)
@@ -264,6 +264,16 @@ struct transaction_manager_test_t : public seastar_test_suite_t {
       auto ext = get_extent(t, i.first, i.second.desc.len);
       EXPECT_EQ(i.second, ext->get_desc());
     }
+    auto lt = create_lazy_transaction();
+    lba_manager->scan_mappings(
+      *lt.t,
+      0,
+      L_ADDR_MAX,
+      [iter=lt.mappings.begin(), &lt](auto l, auto p, auto len) mutable {
+       EXPECT_NE(iter, lt.mappings.end());
+       EXPECT_EQ(l, iter->first);
+       ++iter;
+      }).unsafe_get0();
   }
 
   void submit_transaction(test_transaction_t t) {