From b3521e00093d01751cb4e97c81984989d9aed676 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Tue, 3 Sep 2024 15:14:56 +0800 Subject: [PATCH] crimson/os/seastore: validate the node capacity for lba/backref node correct the LEAF_NODE_CAPACITY for backref nodes Signed-off-by: Zhang Song --- src/crimson/common/fixed_kv_node_layout.h | 12 ++++++++++++ src/crimson/os/seastore/backref/backref_tree_node.h | 8 +++++++- .../os/seastore/lba_manager/btree/lba_btree_node.h | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/crimson/common/fixed_kv_node_layout.h b/src/crimson/common/fixed_kv_node_layout.h index 1b379f843fb4a..2a91ac3954006 100644 --- a/src/crimson/common/fixed_kv_node_layout.h +++ b/src/crimson/common/fixed_kv_node_layout.h @@ -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 struct iter_t { friend class FixedKVNodeLayout; diff --git a/src/crimson/os/seastore/backref/backref_tree_node.h b/src/crimson/os/seastore/backref/backref_tree_node.h index 483c3d139ffee..f2886ded95897 100644 --- a/src/crimson/os/seastore/backref/backref_tree_node.h +++ b/src/crimson/os/seastore/backref/backref_tree_node.h @@ -11,7 +11,7 @@ using backref_node_meta_t = fixed_kv_node_meta_t; using backref_node_meta_le_t = fixed_kv_node_meta_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; @@ -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 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 BackrefLeafNode(T&&... t) : diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h index a051712a6596b..1c923acc87b68 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h @@ -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; using internal_iterator_t = const_iterator; template @@ -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; using parent_type_t = FixedKVLeafNode< LEAF_NODE_CAPACITY, -- 2.39.5