]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: refactor extent rewrite procedure
authorXuehan Xu <xxhdx1985126@gmail.com>
Fri, 23 Jul 2021 12:39:49 +0000 (20:39 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Wed, 8 Sep 2021 03:03:00 +0000 (11:03 +0800)
Move logical extents' rewrite from LBManager to TransactionManager

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.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/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h

index 735c4d69be458eb6ccb3c2a0a52835ff469f614c..406cf8a35ffa96f9c3eee1ea950e72a31d677bfd 100644 (file)
@@ -161,6 +161,18 @@ public:
     Transaction &t,
     CachedExtentRef extent) = 0;
 
+  /**
+   * delayed_update_mapping
+   *
+   * update lba mapping for delayed allocated extents
+   */
+  using update_le_mapping_iertr = base_iertr;
+  using update_le_mapping_ret = base_iertr::future<>;
+  virtual update_le_mapping_ret update_mapping(
+    Transaction& t,
+    laddr_t laddr,
+    paddr_t prev_addr,
+    paddr_t paddr) = 0;
   /**
    * get_physical_extent_if_live
    *
index aa058a976e379efa9f1d88720ed7c37dfde36e54..5e0d608199d278048f05a463093032e2f3e0745d 100644 (file)
@@ -338,50 +338,14 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
     ERRORT("{} has been invalidated", t, *extent);
   }
   assert(!extent->has_been_invalidated());
+  assert(!extent->is_logical());
 
   logger().debug(
     "{}: rewriting {}", 
     __func__,
     *extent);
 
-  if (extent->is_logical()) {
-    auto lextent = extent->cast<LogicalCachedExtent>();
-    cache.retire_extent(t, extent);
-    auto nlextent = cache.alloc_new_extent_by_type(
-      t,
-      lextent->get_type(),
-      lextent->get_length())->cast<LogicalCachedExtent>();
-    lextent->get_bptr().copy_out(
-      0,
-      lextent->get_length(),
-      nlextent->get_bptr().c_str());
-    nlextent->set_laddr(lextent->get_laddr());
-    nlextent->set_pin(lextent->get_pin().duplicate());
-
-    logger().debug(
-      "{}: rewriting {} into {}",
-      __func__,
-      *lextent,
-      *nlextent);
-
-    return update_mapping(
-      t,
-      lextent->get_laddr(),
-      [prev_addr = lextent->get_paddr(), addr = nlextent->get_paddr()](
-       const lba_map_val_t &in) {
-       lba_map_val_t ret = in;
-       ceph_assert(in.paddr == prev_addr);
-       ret.paddr = addr;
-       return ret;
-      }).si_then(
-       [nlextent](auto) {},
-       rewrite_extent_iertr::pass_further{},
-        /* ENOENT in particular should be impossible */
-       crimson::ct_error::assert_all{
-         "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
-       }
-      );
-  } else if (is_lba_node(*extent)) {
+  if (is_lba_node(*extent)) {
     auto c = get_context(t);
     return with_btree(
       c,
@@ -393,6 +357,33 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
   }
 }
 
+BtreeLBAManager::update_le_mapping_ret
+BtreeLBAManager::update_mapping(
+  Transaction& t,
+  laddr_t laddr,
+  paddr_t prev_addr,
+  paddr_t addr)
+{
+  return update_mapping(
+    t,
+    laddr,
+    [prev_addr, addr](
+      const lba_map_val_t &in) {
+      assert(!addr.is_null());
+      lba_map_val_t ret = in;
+      ceph_assert(in.paddr == prev_addr);
+      ret.paddr = addr;
+      return ret;
+    }).si_then(
+      [](auto) {},
+      update_le_mapping_iertr::pass_further{},
+      /* ENOENT in particular should be impossible */
+      crimson::ct_error::assert_all{
+       "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
+      }
+    );
+}
+
 BtreeLBAManager::get_physical_extent_if_live_ret
 BtreeLBAManager::get_physical_extent_if_live(
   Transaction &t,
index a0834b159c24c7ff55ed576444dd8d7a30d671e4..f2574a0c233f973787b16297baf243867f1c2cd2 100644 (file)
@@ -103,6 +103,12 @@ public:
     Transaction &t,
     CachedExtentRef extent) final;
 
+  update_le_mapping_ret update_mapping(
+    Transaction& t,
+    laddr_t laddr,
+    paddr_t prev_addr,
+    paddr_t paddr) final;
+
   get_physical_extent_if_live_ret get_physical_extent_if_live(
     Transaction &t,
     extent_types_t type,
index 3ef0f5af59b589bbe0887b6c6db819004bd2a4bb..52c9ffb3e32610dd2150f0d2f16fff1b92fac258 100644 (file)
@@ -281,6 +281,44 @@ TransactionManager::get_next_dirty_extents(
   return cache->get_next_dirty_extents(t, seq, max_bytes);
 }
 
+TransactionManager::rewrite_extent_ret
+TransactionManager::rewrite_logical_extent(
+  Transaction& t,
+  LogicalCachedExtentRef extent)
+{
+  LOG_PREFIX(TransactionManager::rewrite_logical_extent);
+  if (extent->has_been_invalidated()) {
+    ERRORT("{} has been invalidated", t, *extent);
+  }
+  assert(!extent->has_been_invalidated());
+  DEBUGT("rewriting {}", t, *extent);
+
+  auto lextent = extent->cast<LogicalCachedExtent>();
+  cache->retire_extent(t, extent);
+  auto nlextent = cache->alloc_new_extent_by_type(
+    t,
+    lextent->get_type(),
+    lextent->get_length())->cast<LogicalCachedExtent>();
+  lextent->get_bptr().copy_out(
+    0,
+    lextent->get_length(),
+    nlextent->get_bptr().c_str());
+  nlextent->set_laddr(lextent->get_laddr());
+  nlextent->set_pin(lextent->get_pin().duplicate());
+
+  DEBUGT(
+    "rewriting {} into {}",
+    t,
+    *lextent,
+    *nlextent);
+
+  return lba_manager->update_mapping(
+    t,
+    lextent->get_laddr(),
+    lextent->get_paddr(),
+    nlextent->get_paddr());
+}
+
 TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent(
   Transaction &t,
   CachedExtentRef extent)
@@ -300,7 +338,12 @@ TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent(
     cache->duplicate_for_write(t, extent);
     return rewrite_extent_iertr::now();
   }
-  return lba_manager->rewrite_extent(t, extent);
+
+  if (extent->is_logical()) {
+    return rewrite_logical_extent(t, extent->cast<LogicalCachedExtent>());
+  } else {
+    return lba_manager->rewrite_extent(t, extent);
+  }
 }
 
 TransactionManager::get_extent_if_live_ret TransactionManager::get_extent_if_live(
index f12aac95ff0a52988eac17b3e5bb931c63e18a4b..9a692109c5fc8f7bb16ded990c1072888c91bf40 100644 (file)
@@ -511,6 +511,9 @@ private:
   seastar::metrics::metric_group metrics;
   void register_metrics();
 
+  rewrite_extent_ret rewrite_logical_extent(
+    Transaction& t,
+    LogicalCachedExtentRef extent);
 public:
   // Testing interfaces
   auto get_segment_cleaner() {