]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: introduce named factory methods for alloc/retire
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 18 Dec 2024 08:56:00 +0000 (16:56 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Wed, 18 Dec 2024 08:56:00 +0000 (16:56 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/seastore_types.h

index 1f29d208bd2d90bef4b3088e1776ab805fa1a8bf..a08b8698c90fa308e1206a139d9e2e658f303b21 100644 (file)
@@ -1358,10 +1358,10 @@ record_t Cache::prepare_record(
     if (is_backref_mapped_type(extent->get_type()) ||
        is_retired_placeholder_type(extent->get_type())) {
       rel_delta.alloc_blk_ranges.emplace_back(
-       extent->get_paddr(),
-       L_ADDR_NULL,
-       extent->get_length(),
-       extent->get_type());
+       alloc_blk_t::create_retire(
+         extent->get_paddr(),
+         extent->get_length(),
+         extent->get_type()));
     }
   }
   alloc_deltas.emplace_back(std::move(rel_delta));
@@ -1424,10 +1424,11 @@ record_t Cache::prepare_record(
        alloc_laddr = L_ADDR_MIN;
       }
       alloc_delta.alloc_blk_ranges.emplace_back(
-       i->get_paddr(),
-       alloc_laddr,
-       i->get_length(),
-       i->get_type());
+       alloc_blk_t::create_alloc(
+         i->get_paddr(),
+         alloc_laddr,
+         i->get_length(),
+         i->get_type()));
     }
   }
 
@@ -1447,10 +1448,11 @@ record_t Cache::prepare_record(
         alloc_laddr = i->cast<lba_manager::btree::LBANode>()->get_node_meta().begin;
       }
       alloc_delta.alloc_blk_ranges.emplace_back(
-       i->get_paddr(),
-       alloc_laddr,
-       i->get_length(),
-       i->get_type());
+       alloc_blk_t::create_alloc(
+         i->get_paddr(),
+         alloc_laddr,
+         i->get_length(),
+         i->get_type()));
     }
   }
 
@@ -1475,10 +1477,11 @@ record_t Cache::prepare_record(
   for (auto &i: t.existing_block_list) {
     if (i->is_valid()) {
       alloc_delta.alloc_blk_ranges.emplace_back(
-        i->get_paddr(),
-       i->cast<LogicalCachedExtent>()->get_laddr(),
-       i->get_length(),
-       i->get_type());
+       alloc_blk_t::create_alloc(
+         i->get_paddr(),
+         i->cast<LogicalCachedExtent>()->get_laddr(),
+         i->get_length(),
+         i->get_type()));
     }
   }
   alloc_deltas.emplace_back(std::move(alloc_delta));
@@ -1711,7 +1714,7 @@ void Cache::complete_commit(
        alloc_laddr = L_ADDR_MIN;
       }
       backref_entries.emplace_back(
-       std::make_unique<backref_entry_t>(
+       backref_entry_t::create_alloc(
          i->get_paddr(),
          alloc_laddr,
          i->get_length(),
@@ -1775,9 +1778,8 @@ void Cache::complete_commit(
             extent->get_paddr(),
             extent->get_length());
       backref_entries.emplace_back(
-       std::make_unique<backref_entry_t>(
+       backref_entry_t::create_retire(
          extent->get_paddr(),
-         L_ADDR_NULL,
          extent->get_length(),
          extent->get_type()));
     } else if (is_backref_node(extent->get_type())) {
@@ -1807,7 +1809,7 @@ void Cache::complete_commit(
             i->get_paddr(),
             i->get_length());
       backref_entries.emplace_back(
-        std::make_unique<backref_entry_t>(
+       backref_entry_t::create_alloc(
          i->get_paddr(),
          i->cast<LogicalCachedExtent>()->get_laddr(),
          i->get_length(),
@@ -1955,11 +1957,7 @@ Cache::replay_delta(
       DEBUG("replay alloc_blk {}~0x{:x} {}, journal_seq: {}",
        alloc_blk.paddr, alloc_blk.len, alloc_blk.laddr, journal_seq);
       backref_entries.emplace_back(
-       std::make_unique<backref_entry_t>(
-         alloc_blk.paddr,
-         alloc_blk.laddr,
-         alloc_blk.len,
-         alloc_blk.type));
+       backref_entry_t::create(alloc_blk));
     }
     if (!backref_entries.empty()) {
       backref_batch_update(std::move(backref_entries), journal_seq);
index a6fbf2196b12ce64238177c9244d99d99b2f577b..acba71b9ec6faa9633ab271fcb77109635a93cc8 100644 (file)
@@ -39,6 +39,8 @@ class BackrefManager;
 class SegmentProvider;
 
 struct backref_entry_t {
+  using ref_t = std::unique_ptr<backref_entry_t>;
+
   backref_entry_t(
     const paddr_t& paddr,
     const laddr_t& laddr,
@@ -47,7 +49,9 @@ struct backref_entry_t {
     : paddr(paddr),
       laddr(laddr),
       len(len),
-      type(type) {}
+      type(type) {
+    assert(len > 0);
+  }
   paddr_t paddr = P_ADDR_NULL;
   laddr_t laddr = L_ADDR_NULL;
   extent_len_t len = 0;
@@ -96,11 +100,37 @@ struct backref_entry_t {
       return l.paddr < r;
     }
   };
+
+  static ref_t create_alloc(
+      const paddr_t& paddr,
+      const laddr_t& laddr,
+      extent_len_t len,
+      extent_types_t type) {
+    assert(is_backref_mapped_type(type));
+    assert(laddr != L_ADDR_NULL);
+    return std::make_unique<backref_entry_t>(
+      paddr, laddr, len, type);
+  }
+
+  static ref_t create_retire(
+      const paddr_t& paddr,
+      extent_len_t len,
+      extent_types_t type) {
+    assert(is_backref_mapped_type(type) ||
+          is_retired_placeholder_type(type));
+    return std::make_unique<backref_entry_t>(
+      paddr, L_ADDR_NULL, len, type);
+  }
+
+  static ref_t create(const alloc_blk_t& delta) {
+    return std::make_unique<backref_entry_t>(
+      delta.paddr, delta.laddr, delta.len, delta.type);
+  }
 };
 
 std::ostream &operator<<(std::ostream &out, const backref_entry_t &ent);
 
-using backref_entry_ref = std::unique_ptr<backref_entry_t>;
+using backref_entry_ref = backref_entry_t::ref_t;
 using backref_entry_mset_t = backref_entry_t::multiset_t;
 using backref_entry_refs_t = std::vector<backref_entry_ref>;
 using backref_entryrefs_by_seq_t = std::map<journal_seq_t, backref_entry_refs_t>;
index 98a37cdd33ca3ed1df5f7ba094b5fbcc557983cd..335a439dcb52d1cb0e52a77fb2b2606ba647b72b 100644 (file)
@@ -1965,7 +1965,9 @@ struct alloc_blk_t {
     const laddr_t& laddr,
     extent_len_t len,
     extent_types_t type)
-    : paddr(paddr), laddr(laddr), len(len), type(type) {}
+    : paddr(paddr), laddr(laddr), len(len), type(type) {
+    assert(len > 0);
+  }
 
   explicit alloc_blk_t() = default;
 
@@ -1981,6 +1983,25 @@ struct alloc_blk_t {
     denc(v.type, p);
     DENC_FINISH(p);
   }
+
+  static alloc_blk_t create_alloc(
+      const paddr_t& paddr,
+      const laddr_t& laddr,
+      extent_len_t len,
+      extent_types_t type) {
+    assert(is_backref_mapped_type(type));
+    assert(laddr != L_ADDR_NULL);
+    return alloc_blk_t(paddr, laddr, len, type);
+  }
+
+  static alloc_blk_t create_retire(
+      const paddr_t& paddr,
+      extent_len_t len,
+      extent_types_t type) {
+    assert(is_backref_mapped_type(type) ||
+          is_retired_placeholder_type(type));
+    return alloc_blk_t(paddr, L_ADDR_NULL, len, type);
+  }
 };
 
 // use absolute address