From: Yingxin Cheng Date: Wed, 7 Apr 2021 08:09:41 +0000 (+0800) Subject: crimson/onode-staged-tree: fix container_t::update_size() to accept negative value X-Git-Tag: v17.1.0~2110^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5818e786c43f2ed52ac1fe3414e3416839f23eea;p=ceph.git crimson/onode-staged-tree: fix container_t::update_size() to accept negative value Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.cc index ef16143f9944..8fb3ff1425d8 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.cc @@ -36,6 +36,13 @@ void F013_T::update_size_at( NodeExtentMutable& mut, const me_t& node, index_t index, int change) { assert(index <= node.num_keys); +#ifndef NDEBUG + // check underflow + if (change < 0 && index != node.num_keys) { + assert(node.get_item_start_offset(index) < + node.get_item_end_offset(index)); + } +#endif for (const auto* p_slot = &node.slots[index]; p_slot < &node.slots[node.num_keys]; ++p_slot) { @@ -44,6 +51,14 @@ void F013_T::update_size_at( (void*)&(p_slot->right_offset), node_offset_t(offset - change)); } +#ifndef NDEBUG + // check overflow + if (change > 0 && index != node.num_keys) { + assert(node.num_keys > 0); + assert(node.get_key_start_offset(node.num_keys) <= + node.slots[node.num_keys - 1].right_offset); + } +#endif } template diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h index d9be080201b2..3475784ce9b2 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h @@ -335,7 +335,7 @@ struct staged { template std::enable_if_t - update_size(NodeExtentMutable& mut, node_offset_t insert_size) { + update_size(NodeExtentMutable& mut, int insert_size) { assert(!is_end()); container_t::update_size_at(mut, container, _index, insert_size); } @@ -627,7 +627,7 @@ struct staged { mut, container, key, is_end(), size, p_left_bound); } - void update_size(NodeExtentMutable& mut, node_offset_t insert_size) { + void update_size(NodeExtentMutable& mut, int insert_size) { assert(!is_end()); container_t::update_size(mut, container, insert_size); }