From: Xuehan Xu Date: Wed, 17 Nov 2021 01:10:59 +0000 (+0800) Subject: crimson/os/seastore/lba_manager: do full merge if the donor node is *AT* its minimum... X-Git-Tag: v17.1.0~420^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=74ae71ddb844b6ab8e6ff39fbbff6048f18260cb;p=ceph-ci.git crimson/os/seastore/lba_manager: do full merge if the donor node is *AT* its minimum capacity Fixes: https://tracker.ceph.com/issues/53273 Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc index ed9d4f5ed3e..2d1a7aba64d 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc @@ -675,7 +675,7 @@ LBABtree::handle_merge_ret merge_level( auto [liter, riter] = donor_is_left ? std::make_pair(donor_iter, iter) : std::make_pair(iter, donor_iter); - if (donor->below_min_capacity()) { + if (donor->at_min_capacity()) { auto replacement = l->make_full_merge(c, r); parent_pos.node->update( 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 09a9a1f44c6..7f5c97c8893 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 @@ -322,6 +322,11 @@ struct LBAInternalNode return get_size() == get_capacity(); } + bool at_min_capacity() const { + assert(get_size() >= (get_min_capacity() - 1)); + return get_size() <= get_min_capacity(); + } + bool below_min_capacity() const { assert(get_size() >= (get_min_capacity() - 1)); return get_size() < get_min_capacity(); @@ -545,6 +550,11 @@ struct LBALeafNode return get_size() == get_capacity(); } + bool at_min_capacity() const { + assert(get_size() >= (get_min_capacity() - 1)); + return get_size() <= get_min_capacity(); + } + bool below_min_capacity() const { assert(get_size() >= (get_min_capacity() - 1)); return get_size() < get_min_capacity();