]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/lba: add extent type to lba map values 66740/head
authorXuehan Xu <xuxuehan@qianxin.com>
Thu, 25 Dec 2025 02:58:21 +0000 (10:58 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Mon, 19 Jan 2026 02:45:44 +0000 (10:45 +0800)
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/btree/btree_types.cc
src/crimson/os/seastore/btree/btree_types.h
src/crimson/os/seastore/lba/btree_lba_manager.cc
src/crimson/os/seastore/lba/btree_lba_manager.h
src/crimson/os/seastore/lba/lba_btree_node.h
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_transaction_manager.cc

index 840aa766dca626a80f5c54506451fe5a75973f28..bf4940d59e722e6fc853100959c9fd1dc9d64826 100644 (file)
@@ -90,6 +90,7 @@ std::ostream& operator<<(std::ostream& out, const lba_map_val_t& v)
   return out << "lba_map_val_t("
              << v.pladdr
              << "~0x" << std::hex << v.len
+             << ", type=" << (extent_types_t)v.type
              << ", checksum=0x" << v.checksum
              << ", refcount=" << std::dec << v.refcount
              << ")";
index 2359f3ce7ea79ace5956a132fb99bb64a5914e4c..0f465fcbce9c75828803138ddfca15a723763dad 100644 (file)
@@ -112,14 +112,17 @@ struct lba_map_val_t {
                           //   laddr of a direct lba mapping(see btree_lba_manager.h)
   extent_ref_count_t refcount = 0; ///< refcount
   checksum_t checksum = 0; ///< checksum of original block written at paddr (TODO)
+  extent_types_t type = extent_types_t::NONE;
 
   lba_map_val_t() = default;
   lba_map_val_t(
     extent_len_t len,
     pladdr_t pladdr,
     extent_ref_count_t refcount,
-    checksum_t checksum)
-    : len(len), pladdr(pladdr), refcount(refcount), checksum(checksum) {}
+    checksum_t checksum,
+    extent_types_t type)
+    : len(len), pladdr(pladdr), refcount(refcount),
+      checksum(checksum), type(type) {}
   bool operator==(const lba_map_val_t&) const = default;
 };
 
@@ -135,6 +138,7 @@ struct __attribute__((packed)) lba_map_val_le_t {
   pladdr_le_t pladdr;
   extent_ref_count_le_t refcount{0};
   checksum_le_t checksum{0};
+  extent_types_le_t type = 0;
 
   lba_map_val_le_t() = default;
   lba_map_val_le_t(const lba_map_val_le_t &) = default;
@@ -142,10 +146,16 @@ struct __attribute__((packed)) lba_map_val_le_t {
     : len(init_extent_len_le(val.len)),
       pladdr(pladdr_le_t(val.pladdr)),
       refcount(val.refcount),
-      checksum(val.checksum) {}
+      checksum(val.checksum),
+      type((extent_types_le_t)val.type) {}
 
   operator lba_map_val_t() const {
-    return lba_map_val_t{ len, pladdr, refcount, checksum };
+    return lba_map_val_t{
+      len,
+      pladdr,
+      refcount,
+      checksum,
+      (extent_types_t)type};
   }
 };
 
index 8bc4d6d1adf8b1c483bafdc85601d6aa5fd445bd..db492e832473195afa5611ffa38a45682d1acaa8 100644 (file)
@@ -336,7 +336,12 @@ BtreeLBAManager::reserve_region(
     [pos=std::move(pos), c, addr, len](auto &btree) mutable {
     auto &cursor = pos.get_effective_cursor();
     auto iter = btree.make_partial_iter(c, cursor);
-    lba_map_val_t val{len, P_ADDR_ZERO, EXTENT_DEFAULT_REF_COUNT, 0};
+    lba_map_val_t val{
+      len,
+      P_ADDR_ZERO,
+      EXTENT_DEFAULT_REF_COUNT,
+      0,
+      extent_types_t::NONE};
     return btree.insert(c, iter, addr, val
     ).si_then([c](auto p) {
       auto &[iter, inserted] = p;
@@ -391,7 +396,8 @@ BtreeLBAManager::alloc_extents(
              ext->get_length(),
              ext->get_paddr(),
              EXTENT_DEFAULT_REF_COUNT,
-             ext->get_last_committed_crc()}
+             ext->get_last_committed_crc(),
+              ext->get_type()}
          ).si_then([ext, c, FNAME, &iter, &ret](auto p) {
            auto &[it, inserted] = p;
            ceph_assert(inserted);
@@ -490,7 +496,12 @@ BtreeLBAManager::clone_mapping(
            c,
            btree.make_partial_iter(c, cursor),
            state.laddr,
-            lba_map_val_t{state.len, inter_key, EXTENT_DEFAULT_REF_COUNT, 0});
+            lba_map_val_t{
+              state.len,
+              inter_key,
+              EXTENT_DEFAULT_REF_COUNT,
+              0,
+              extent_types_t::NONE});
        }).si_then([c, &state](auto p) {
          auto &[iter, inserted] = p;
          auto &leaf_node = *iter.get_leaf_node();
@@ -1205,19 +1216,20 @@ BtreeLBAManager::scan_mapped_space(
       pos = co_await pos.next(c);
       continue;
     }
-    TRACET("tree value {}~{} {}~{} used",
+    TRACET("tree value {}~{} {}~{} used, type {}",
            c.trans,
            pos.get_key(),
            pos.get_val().len,
            pos.get_val().pladdr.get_paddr(),
-           pos.get_val().len);
+           pos.get_val().len,
+           pos.get_val().type);
     ceph_assert(pos.get_val().len > 0 &&
                 pos.get_val().len % block_size == 0);
     ceph_assert(pos.get_val().pladdr != L_ADDR_NULL);
     scan_visitor(
         pos.get_val().pladdr.get_paddr(),
         pos.get_val().len,
-        extent_types_t::NONE,
+        pos.get_val().type,
         pos.get_key());
     pos = co_await pos.next(c);
   }
index 97d7c43a300f7d8ed1ea6baa1f5da8bb9c8046f9..c34e16062a7379945abadd5fef871ec1624932c0 100644 (file)
@@ -391,7 +391,8 @@ private:
          len,
          pladdr_t(P_ADDR_ZERO),
          EXTENT_DEFAULT_REF_COUNT,
-         0
+         0,
+          extent_types_t::NONE
        }};
     }
     static alloc_mapping_info_t create_indirect(
@@ -404,8 +405,9 @@ private:
          len,
          pladdr_t(intermediate_key),
          EXTENT_DEFAULT_REF_COUNT,
-         0     // crc will only be used and checked with LBA direct mappings
+         0,    // crc will only be used and checked with LBA direct mappings
                // also see pin_to_extent(_by_type)
+          extent_types_t::NONE
        }};
     }
     static alloc_mapping_info_t create_direct(
@@ -415,7 +417,14 @@ private:
       extent_ref_count_t refcount,
       checksum_t checksum,
       LogicalChildNode& extent) {
-      return {laddr, {len, pladdr_t(paddr), refcount, checksum}, &extent};
+      return {
+        laddr,
+        {len,
+         pladdr_t(paddr),
+         refcount,
+         checksum,
+         extent.get_type()},
+        &extent};
     }
   };
 
index a3f9bcc1c0340efa314cf9e369c2679e6187fe12..5f40b193d06ef578419c8312c159ac0261346357 100644 (file)
@@ -96,7 +96,7 @@ using LBAInternalNodeRef = LBAInternalNode::Ref;
  * TODO: update FixedKVNodeLayout to handle the above calculation
  * TODO: the above alignment probably isn't portable without further work
  */
-constexpr size_t LEAF_NODE_CAPACITY = 140;
+constexpr size_t LEAF_NODE_CAPACITY = 135;
 
 struct LBALeafNode
   : FixedKVLeafNode<
index c91a6a2238540473230a7dd7bc120f09d2afce09..d263b72f489adf68c6e5522dbb5f3ebfbe66aab8 100644 (file)
@@ -312,8 +312,8 @@ struct lba_btree_test : btree_test_base {
       }).unsafe_get();
   }
 
-  static auto get_map_val(extent_len_t len) {
-    return lba_map_val_t{0, (pladdr_t)P_ADDR_NULL, len, 0};
+  static auto get_map_val(extent_len_t len, extent_types_t type) {
+    return lba_map_val_t{0, (pladdr_t)P_ADDR_NULL, len, 0, type};
   }
 
   device_off_t next_off = 0;
@@ -324,7 +324,7 @@ struct lba_btree_test : btree_test_base {
 
   void insert(laddr_t addr, extent_len_t len) {
     ceph_assert(check.count(addr) == 0);
-    check.emplace(addr, get_map_val(len));
+    check.emplace(addr, get_map_val(len, TestBlock::TYPE));
     lba_btree_update([=, this](auto &btree, auto &t) {
       auto extents = cache->alloc_new_data_extents<TestBlock>(
          t,
@@ -339,7 +339,7 @@ struct lba_btree_test : btree_test_base {
          extents,
          [this, addr, len, &t, &btree](auto &extent) {
          return btree.insert(
-           get_op_context(t), addr, get_map_val(len)
+           get_op_context(t), addr, get_map_val(len, extent->get_type())
          ).si_then([addr, extent](auto p){
            auto& [iter, inserted] = p;
            iter.get_leaf_node()->insert_child_ptr(
index 43b12e447a394b891d909442ea407e7610cb535d..b98b9c4b7ce6c7713107d972e39584d9ade07520 100644 (file)
@@ -1831,7 +1831,7 @@ TEST_P(tm_random_block_device_test_t, scatter_allocation)
     laddr_t ADDR = get_laddr_hint(0xFF * 4096);
     epm->prefill_fragmented_devices();
     auto t = create_transaction();
-    for (int i = 0; i < 1991; i++) {
+    for (int i = 0; i < 1989; i++) {
       auto extents = alloc_extents(t, (ADDR + i * 16384).checked_to_laddr(), 16384, 'a');
     }
     alloc_extents_deemed_fail(t, (ADDR + 1991 * 16384).checked_to_laddr(), 16384, 'a');