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;
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>;
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) :
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) :
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>
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,