]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: validate the node capacity for lba/backref node
authorZhang Song <zhangsong02@qianxin.com>
Tue, 3 Sep 2024 07:14:56 +0000 (15:14 +0800)
committerZhang Song <zhangsong02@qianxin.com>
Tue, 3 Sep 2024 07:28:42 +0000 (15:28 +0800)
correct the LEAF_NODE_CAPACITY for backref nodes

Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
src/crimson/common/fixed_kv_node_layout.h
src/crimson/os/seastore/backref/backref_tree_node.h
src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h

index 1b379f843fb4ae1baf2ea79e41ef2810eebbb74b..2a91ac3954006b16aa7c2368cb2c955d52da3464 100644 (file)
@@ -58,6 +58,18 @@ class FixedKVNodeLayout {
   static constexpr L layout{1, 1, 1, CAPACITY, CAPACITY};
 
 public:
+  static constexpr bool check_capacity(size_t node_size) {
+    auto kv_size = sizeof(KINT) + sizeof(VINT);
+    // layout_size should be consistent with the definition of layout
+    auto layout_size =
+       sizeof(ceph_le32)     // checksum
+       + sizeof(ceph_le32)   // size
+       + sizeof(MetaInt)     // meta
+       + kv_size * CAPACITY;  // keys and values
+    return layout_size <= node_size &&
+       (layout_size + kv_size) > node_size;
+  }
+
   template <bool is_const>
   struct iter_t {
     friend class FixedKVNodeLayout;
index 483c3d139ffee75a860675d300e5ca5e84cd239d..f2886ded95897b5b0f4c43d6be31394abe18958c 100644 (file)
@@ -11,7 +11,7 @@ using backref_node_meta_t = fixed_kv_node_meta_t<paddr_t>;
 using backref_node_meta_le_t = fixed_kv_node_meta_le_t<paddr_le_t>;
 
 constexpr size_t INTERNAL_NODE_CAPACITY = 254;
-constexpr size_t LEAF_NODE_CAPACITY = 169;
+constexpr size_t LEAF_NODE_CAPACITY = 193;
 
 using BackrefNode = FixedKVNode<paddr_t>;
 
@@ -57,6 +57,9 @@ class BackrefInternalNode
       paddr_t, paddr_le_t,
       BACKREF_NODE_SIZE,
       BackrefInternalNode> {
+  static_assert(
+    check_capacity(BACKREF_NODE_SIZE),
+    "INTERNAL_NODE_CAPACITY doesn't fit in BACKREF_NODE_SIZE");
 public:
   template <typename... T>
   BackrefInternalNode(T&&... t) :
@@ -78,6 +81,9 @@ class BackrefLeafNode
       BACKREF_NODE_SIZE,
       BackrefLeafNode,
       false> {
+  static_assert(
+    check_capacity(BACKREF_NODE_SIZE),
+    "LEAF_NODE_CAPACITY doesn't fit in BACKREF_NODE_SIZE");
 public:
   template <typename... T>
   BackrefLeafNode(T&&... t) :
index a051712a6596bd1f4feeca35a253763c4832f039..1c923acc87b68d4ec01ea2b848cbeaae15e5c872 100644 (file)
@@ -82,6 +82,9 @@ struct LBAInternalNode
       laddr_t, laddr_le_t,
       LBA_BLOCK_SIZE,
       LBAInternalNode> {
+  static_assert(
+    check_capacity(LBA_BLOCK_SIZE),
+    "INTERNAL_NODE_CAPACITY doesn't fit in LBA_BLOCK_SIZE");
   using Ref = TCachedExtentRef<LBAInternalNode>;
   using internal_iterator_t = const_iterator;
   template <typename... T>
@@ -147,6 +150,9 @@ struct LBALeafNode
       LBA_BLOCK_SIZE,
       LBALeafNode,
       true> {
+  static_assert(
+    check_capacity(LBA_BLOCK_SIZE),
+    "LEAF_NODE_CAPACITY doesn't fit in LBA_BLOCK_SIZE");
   using Ref = TCachedExtentRef<LBALeafNode>;
   using parent_type_t = FixedKVLeafNode<
                          LEAF_NODE_CAPACITY,