]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/seastore: implement and test get_mapping(t, laddr)
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 27 May 2021 08:48:47 +0000 (16:48 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 28 May 2021 07:05:44 +0000 (15:05 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
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

index c464994d6fdfdf8c8c1c95a315ab44a4320ee03f..df8104b240b73452c5342b647914fdc4555caa24 100644 (file)
@@ -107,7 +107,16 @@ BtreeLBAManager::get_mapping(
   Transaction &t,
   laddr_t offset)
 {
-  ceph_abort("not implemented");
+  logger().debug("BtreeLBAManager::get_mapping: {}", offset);
+  return get_root(t
+  ).safe_then([this, &t, offset] (auto extent) {
+    return extent->lookup_pin(get_context(t), offset);
+  }).safe_then([] (auto &&e) {
+    logger().debug("BtreeLBAManager::get_mapping: got mapping {}", *e);
+    return get_mapping_ret(
+      get_mapping_ertr::ready_future_marker{},
+      std::move(e));
+  });
 }
 
 BtreeLBAManager::find_hole_ret
index 516defd14b4073efc8569bae90ab6e4f3b7fc572..6ded255f1bae7b0c00e7ca19fba7626f8a134be5 100644 (file)
@@ -50,8 +50,6 @@ using BtreeLBAPinRef = std::unique_ptr<BtreeLBAPin>;
  */
 struct LBANode : CachedExtent {
   using LBANodeRef = TCachedExtentRef<LBANode>;
-  using lookup_range_ertr = LBAManager::get_mappings_ertr;
-  using lookup_range_ret = LBAManager::get_mappings_ret;
 
   btree_range_pin_t pin;
 
@@ -79,11 +77,24 @@ struct LBANode : CachedExtent {
    *
    * Returns mappings within range [addr, addr+len)
    */
+  using lookup_range_ertr = LBAManager::get_mappings_ertr;
+  using lookup_range_ret = LBAManager::get_mappings_ret;
   virtual lookup_range_ret lookup_range(
     op_context_t c,
     laddr_t addr,
     extent_len_t len) = 0;
 
+  /**
+   * lookup_pin
+   *
+   * Returns the mapping at addr
+   */
+  using lookup_pin_ertr = LBAManager::get_mapping_ertr;
+  using lookup_pin_ret = LBAManager::get_mapping_ret;
+  virtual lookup_pin_ret lookup_pin(
+    op_context_t c,
+    laddr_t addr) = 0;
+
   /**
    * insert
    *
index fe03f8046fe3b0bf53b64b32c4474c1fc41fdbe2..5139dae4ef42d1f27ffaa505dbb12aa3fc3635a7 100644 (file)
@@ -87,6 +87,22 @@ LBAInternalNode::lookup_range_ret LBAInternalNode::lookup_range(
     });
 }
 
+LBAInternalNode::lookup_pin_ret LBAInternalNode::lookup_pin(
+  op_context_t c,
+  laddr_t addr)
+{
+  auto iter = get_containing_child(addr);
+  return get_lba_btree_extent(
+    c,
+    this,
+    get_meta().depth - 1,
+    iter->get_val(),
+    get_paddr()
+  ).safe_then([c, addr] (LBANodeRef extent) {
+    return extent->lookup_pin(c, addr);
+  }).finally([ref=LBANodeRef(this)] {});
+}
+
 LBAInternalNode::insert_ret LBAInternalNode::insert(
   op_context_t c,
   laddr_t laddr,
@@ -486,6 +502,25 @@ LBALeafNode::lookup_range_ret LBALeafNode::lookup_range(
     std::move(ret));
 }
 
+LBALeafNode::lookup_pin_ret LBALeafNode::lookup_pin(
+  op_context_t c,
+  laddr_t addr)
+{
+  logger().debug("LBALeafNode::lookup_pin {}", addr);
+  auto iter = find(addr);
+  if (iter == end()) {
+    return crimson::ct_error::enoent::make();
+  }
+  auto val = iter->get_val();
+  auto begin = iter->get_key();
+  return lookup_pin_ret(
+    lookup_pin_ertr::ready_future_marker{},
+    std::make_unique<BtreeLBAPin>(
+      this,
+      val.paddr.maybe_relative_to(get_paddr()),
+      lba_node_meta_t{ begin, begin + val.len, 0}));
+}
+
 LBALeafNode::insert_ret LBALeafNode::insert(
   op_context_t c,
   laddr_t laddr,
index e2cc70eb03a6d73ec5b008759586f52e48d19a88..07385e2ffaa4d5c15dceda17e2ef9618db067611 100644 (file)
@@ -99,6 +99,10 @@ struct LBAInternalNode
     laddr_t addr,
     extent_len_t len) final;
 
+  lookup_pin_ret lookup_pin(
+    op_context_t c,
+    laddr_t addr) final;
+
   insert_ret insert(
     op_context_t c,
     laddr_t laddr,
@@ -374,6 +378,10 @@ struct LBALeafNode
     laddr_t addr,
     extent_len_t len) final;
 
+  lookup_pin_ret lookup_pin(
+    op_context_t c,
+    laddr_t addr) final;
+
   insert_ret insert(
     op_context_t c,
     laddr_t laddr,
index 281ad92c0188d970f37aea0bd66987d95e85b29c..131b7a6d659633cf7669c00c93537532da525216 100644 (file)
@@ -272,15 +272,23 @@ struct btree_lba_manager_test :
 
   void check_mappings(test_transaction_t &t) {
     for (auto &&i: t.mappings) {
+      auto laddr = i.first;
+      auto len = i.second.len;
+
       auto ret_list = lba_manager->get_mappings(
-       *t.t, i.first, i.second.len
+       *t.t, laddr, len
       ).unsafe_get0();
       EXPECT_EQ(ret_list.size(), 1);
       auto &ret = *ret_list.begin();
       EXPECT_EQ(i.second.addr, ret->get_paddr());
-      EXPECT_EQ(i.first, ret->get_laddr());
-      EXPECT_EQ(i.second.len, ret->get_length());
-      // TODO: test get_mapping()
+      EXPECT_EQ(laddr, ret->get_laddr());
+      EXPECT_EQ(len, ret->get_length());
+
+      auto ret_pin = lba_manager->get_mapping(
+        *t.t, laddr).unsafe_get0();
+      EXPECT_EQ(i.second.addr, ret_pin->get_paddr());
+      EXPECT_EQ(laddr, ret_pin->get_laddr());
+      EXPECT_EQ(len, ret_pin->get_length());
     }
     lba_manager->scan_mappings(
       *t.t,