]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: add extent alloc info to journal records
authorXuehan Xu <xxhdx1985126@gmail.com>
Sun, 13 Mar 2022 04:15:38 +0000 (12:15 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sat, 7 May 2022 05:13:35 +0000 (13:13 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/cached_extent.cc
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/random_block_manager/nvme_manager.cc
src/crimson/os/seastore/seastore_types.h
src/test/crimson/seastore/test_randomblock_manager.cc

index 0e929ed6e256052fd4ffb945b93b778304ce8a39..22b83fe701e69864f092437895264c95b00a8fa8 100644 (file)
@@ -18,6 +18,7 @@
 #include "crimson/os/seastore/object_data_handler.h"
 #include "crimson/os/seastore/collection_manager/collection_flat_node.h"
 #include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h"
+#include "crimson/os/seastore/backref/backref_tree_node.h"
 #include "test/crimson/seastore/test_block.h"
 
 using std::string_view;
@@ -1026,28 +1027,31 @@ record_t Cache::prepare_record(
   // Transaction is now a go, set up in-memory cache state
   // invalidate now invalid blocks
   io_stat_t retire_stat;
+  std::vector<alloc_delta_t> alloc_deltas;
+  alloc_delta_t rel_delta;
+  rel_delta.op = alloc_delta_t::op_types_t::CLEAR;
   for (auto &i: t.retired_set) {
     get_by_ext(efforts.retire_by_ext,
                i->get_type()).increment(i->get_length());
     retire_stat.increment(i->get_length());
     DEBUGT("retired and remove extent -- {}", t, *i);
     commit_retire_extent(t, i);
-    // FIXME: whether the extent belongs to RBM should be available through its
-    // device-id from its paddr after RBM is properly integrated.
-    /*
-    if (i belongs to RBM) {
-      paddr_t paddr = i->get_paddr();
-      alloc_delta_t delta;
-      delta.op = alloc_delta_t::op_types_t::CLEAR;
-      delta.alloc_blk_ranges.push_back(std::make_pair(paddr, i->get_length()));
-      t.add_rbm_alloc_info_blocks(delta);
+    if (is_backref_mapped_extent_node(i)
+         || is_retired_placeholder(i->get_type())) {
+      rel_delta.alloc_blk_ranges.emplace_back(
+       i->get_paddr(),
+       L_ADDR_NULL,
+       i->get_length(),
+       i->get_type());
     }
-    */
   }
+  alloc_deltas.emplace_back(std::move(rel_delta));
 
   record.extents.reserve(t.inline_block_list.size());
   io_stat_t fresh_stat;
   io_stat_t fresh_invalid_stat;
+  alloc_delta_t alloc_delta;
+  alloc_delta.op = alloc_delta_t::op_types_t::SET;
   for (auto &i: t.inline_block_list) {
     if (!i->is_valid()) {
       DEBUGT("invalid fresh inline extent -- {}", t, *i);
@@ -1087,15 +1091,18 @@ record_t Cache::prepare_record(
        std::move(bl),
        i->get_last_modified().time_since_epoch().count()
       });
-  }
-
-  for (auto b : t.rbm_alloc_info_blocks) {
-    bufferlist bl;
-    encode(b, bl);
-    delta_info_t delta;
-    delta.type = extent_types_t::RBM_ALLOC_INFO;
-    delta.bl = bl;
-    record.push_back(std::move(delta));
+    if (i->is_valid()
+       && is_backref_mapped_extent_node(i)) {
+      alloc_delta.alloc_blk_ranges.emplace_back(
+       i->get_paddr(),
+       i->is_logical()
+       ? i->cast<LogicalCachedExtent>()->get_laddr()
+       : (is_lba_node(i->get_type())
+         ? i->cast<lba_manager::btree::LBANode>()->get_node_meta().begin
+         : L_ADDR_NULL),
+       i->get_length(),
+       i->get_type());
+    }
   }
 
   for (auto &i: t.ool_block_list) {
@@ -1104,6 +1111,25 @@ record_t Cache::prepare_record(
     assert(!i->is_inline());
     get_by_ext(efforts.fresh_ool_by_ext,
                i->get_type()).increment(i->get_length());
+    if (is_backref_mapped_extent_node(i)) {
+      alloc_delta.alloc_blk_ranges.emplace_back(
+       i->get_paddr(),
+       i->is_logical()
+       ? i->cast<LogicalCachedExtent>()->get_laddr()
+       : i->cast<lba_manager::btree::LBANode>()->get_node_meta().begin,
+       i->get_length(),
+       i->get_type());
+    }
+  }
+  alloc_deltas.emplace_back(std::move(alloc_delta));
+
+  for (auto b : alloc_deltas) {
+    bufferlist bl;
+    encode(b, bl);
+    delta_info_t delta;
+    delta.type = extent_types_t::ALLOC_INFO;
+    delta.bl = bl;
+    record.push_back(std::move(delta));
   }
 
   ceph_assert(t.get_fresh_block_stats().num ==
index d2b12cfd9ad22d24b4e463480bb96ed0b788914f..d862ac6bc503354b16fa7b8c0f68aa10940889dc 100644 (file)
@@ -35,6 +35,12 @@ struct backref_buf_entry_t {
       type(type),
       seq(seq)
   {}
+  backref_buf_entry_t(alloc_blk_t alloc_blk)
+    : paddr(alloc_blk.paddr),
+      laddr(alloc_blk.laddr),
+      len(alloc_blk.len),
+      type(alloc_blk.type)
+  {}
   const paddr_t paddr = P_ADDR_NULL;
   const laddr_t laddr = L_ADDR_NULL;
   const extent_len_t len = 0;
index 1b0ea5b04b1fabd161d41091dc24936b09b9d63b..a4f7423f5f32a6660c0ef887c940cba45f4593f3 100644 (file)
@@ -35,6 +35,12 @@ void intrusive_ptr_release(CachedExtent *ptr)
 
 #endif
 
+bool is_backref_mapped_extent_node(const CachedExtentRef &extent) {
+  return extent->is_logical()
+    || is_lba_node(extent->get_type())
+    || extent->get_type() == extent_types_t::TEST_BLOCK_PHYSICAL;
+}
+
 std::ostream &operator<<(std::ostream &out, CachedExtent::extent_state_t state)
 {
   switch (state) {
index 4cb86c49eff64ed36cc526da92d2b7f5e6c5b664..ba3110c675d59dc0c00fa766aa3361486e28c7fc 100644 (file)
@@ -525,6 +525,8 @@ protected:
 std::ostream &operator<<(std::ostream &, CachedExtent::extent_state_t);
 std::ostream &operator<<(std::ostream &, const CachedExtent&);
 
+bool is_backref_mapped_extent_node(const CachedExtentRef &extent);
+
 /// Compare extents by paddr
 struct paddr_cmp {
   bool operator()(paddr_t lhs, const CachedExtent &rhs) const {
index 9367da913a2b404e75eeb356126c95b83aee1cfb..0cfa30e58e1e2c250d650dedfa58813819235d4e 100644 (file)
@@ -262,21 +262,10 @@ NVMeManager::allocate_ret NVMeManager::alloc_extent(
    *
    */
   return find_free_block(t, size
-      ).safe_then([this, &t] (auto alloc_extent) mutable
+      ).safe_then([this] (auto alloc_extent) mutable
        -> allocate_ertr::future<paddr_t> {
        logger().debug("after find_free_block: allocated {}", alloc_extent);
-       if (!alloc_extent.empty()) {
-         alloc_delta_t alloc_info;
-         for (auto p : alloc_extent) {
-           paddr_t paddr = convert_abs_addr_to_paddr(
-             p.first * super.block_size,
-             super.device_id);
-           size_t len = p.second * super.block_size;
-           alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len));
-           alloc_info.op = alloc_delta_t::op_types_t::SET;
-         }
-         t.add_alloc_info_blocks(std::move(alloc_info));
-       } else {
+       if (alloc_extent.empty()) {
          return crimson::ct_error::enospc::make();
        }
        paddr_t paddr = convert_abs_addr_to_paddr(
@@ -302,7 +291,8 @@ void NVMeManager::add_free_extent(
     from,
     super.device_id);
   alloc_delta_t alloc_info;
-  alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len));
+  alloc_info.alloc_blk_ranges.emplace_back(
+    paddr, L_ADDR_NULL, len, extent_types_t::ROOT);
   alloc_info.op = alloc_delta_t::op_types_t::CLEAR;
   v.push_back(alloc_info);
 }
@@ -437,16 +427,16 @@ NVMeManager::write_ertr::future<> NVMeManager::sync_allocation(
       [this](auto &alloc) {
       return crimson::do_for_each(alloc.alloc_blk_ranges,
         [this, &alloc] (auto &range) -> write_ertr::future<> {
-        logger().debug("range {} ~ {}", range.first, range.second);
+        logger().debug("range {} ~ {}", range.paddr, range.len);
        bitmap_op_types_t op =
          (alloc.op == alloc_delta_t::op_types_t::SET) ?
          bitmap_op_types_t::ALL_SET :
          bitmap_op_types_t::ALL_CLEAR;
        rbm_abs_addr addr = convert_paddr_to_abs_addr(
-         range.first);
+         range.paddr);
        blk_no_t start = addr / super.block_size;
        blk_no_t end = start +
-         (round_up_to(range.second, super.block_size)) / super.block_size
+         (round_up_to(range.len, super.block_size)) / super.block_size
           - 1;
        return rbm_sync_block_bitmap_by_range(
          start,
@@ -459,14 +449,14 @@ NVMeManager::write_ertr::future<> NVMeManager::sync_allocation(
        for (auto r : b.alloc_blk_ranges) {
          if (b.op == alloc_delta_t::op_types_t::SET) {
            alloc_block_count +=
-             round_up_to(r.second, super.block_size) / super.block_size;
+             round_up_to(r.len, super.block_size) / super.block_size;
            logger().debug(" complete alloc block: start {} len {} ",
-                          r.first, r.second);
+                          r.paddr, r.len);
          } else {
            alloc_block_count -=
-             round_up_to(r.second, super.block_size) / super.block_size;
+             round_up_to(r.len, super.block_size) / super.block_size;
            logger().debug(" complete alloc block: start {} len {} ",
-                          r.first, r.second);
+                          r.paddr, r.len);
          }
        }
       }
index 068180b3d8b81d5a982968d21165bde1cdc8e161..404a4f48126b554d7e9798f0e5bf04482042eafd 100644 (file)
@@ -1264,6 +1264,31 @@ struct __attribute__((packed)) root_t {
   }
 };
 
+struct alloc_blk_t {
+  alloc_blk_t(
+    paddr_t paddr,
+    laddr_t laddr,
+    extent_len_t len,
+    extent_types_t type)
+    : paddr(paddr), laddr(laddr), len(len), type(type)
+  {}
+
+  explicit alloc_blk_t() = default;
+
+  paddr_t paddr = P_ADDR_NULL;
+  laddr_t laddr = L_ADDR_NULL;
+  extent_len_t len = 0;
+  extent_types_t type = extent_types_t::ROOT;
+  DENC(alloc_blk_t, v, p) {
+    DENC_START(1, 1, p);
+    denc(v.paddr, p);
+    denc(v.laddr, p);
+    denc(v.len, p);
+    denc(v.type, p);
+    DENC_FINISH(p);
+  }
+};
+
 // use absolute address
 struct alloc_delta_t {
   enum class op_types_t : uint8_t {
@@ -1271,7 +1296,7 @@ struct alloc_delta_t {
     SET = 1,
     CLEAR = 2
   };
-  std::vector<std::pair<paddr_t, size_t>> alloc_blk_ranges;
+  std::vector<alloc_blk_t> alloc_blk_ranges;
   op_types_t op = op_types_t::NONE;
 
   alloc_delta_t() = default;
@@ -1749,6 +1774,7 @@ WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::record_header_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::record_group_header_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::extent_info_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::segment_header_t)
+WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::alloc_blk_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::alloc_delta_t)
 WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::segment_tail_t)
 
index 9872c52c65aab4a5d452011e4dd782798cfbfa84..dafdcdee8ab685fe4e16c07285bd4746686e51fe 100644 (file)
@@ -111,8 +111,9 @@ struct rbm_test_t :
            p.first * block_size,
            rbm_manager->get_device_id());
        size_t len = p.second * block_size;
-       alloc_info.alloc_blk_ranges.push_back(std::make_pair(paddr, len));
-       alloc_info.op = rbm_alloc_delta_t::op_types_t::SET;
+       alloc_info.alloc_blk_ranges.emplace_back(
+         paddr, L_ADDR_NULL, len, extent_types_t::ROOT);
+       alloc_info.op = alloc_delta_t::op_types_t::SET;
       }
       t.add_rbm_allocated_blocks(alloc_info);
     }
@@ -133,8 +134,8 @@ struct rbm_test_t :
     for (auto p : allocated_blocks) {
       for (auto b : p.alloc_blk_ranges) {
        rbm_abs_addr addr =
-         convert_paddr_to_abs_addr(b.first);
-       alloc_ids.insert(addr / block_size, b.second / block_size);
+         convert_paddr_to_abs_addr(b.paddr);
+       alloc_ids.insert(addr / block_size, b.len / block_size);
       }
     }
     logger().debug(" get allocated blockid {}", alloc_ids);