From dd2c6998927dc457231c5378f9ba277b7572c88f Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Sun, 24 Oct 2021 23:03:33 -0700 Subject: [PATCH] crimson/os/seastore/lba_manager/lba_btree: add at_boundary helper distinct from is_end From an external caller, the condition is identical. However, internally iterators may be at a leaf boundary without being at end(). For those checks, use at_boundary() instead. Signed-off-by: Samuel Just --- src/crimson/os/seastore/lba_manager/btree/lba_btree.cc | 4 ++-- src/crimson/os/seastore/lba_manager/btree/lba_btree.h | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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 31770ed688eb8..a1a324f62d20b 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc @@ -166,7 +166,7 @@ LBABtree::insert_ret LBABtree::insert( return find_insertion( c, laddr, ret ).si_then([this, c, laddr, val, &ret] { - if (!ret.is_end() && ret.get_key() == laddr) { + if (!ret.at_boundary() && ret.get_key() == laddr) { return insert_ret( interruptible::ready_future_marker{}, std::make_pair(ret, false)); @@ -488,7 +488,7 @@ LBABtree::find_insertion_ret LBABtree::find_insertion( // invariant that pos is a valid index for the node in the event // that the insertion point is at the end of a node. p.leaf.pos++; - assert(p.is_end()); + assert(p.at_boundary()); iter = p; return seastar::now(); }); diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h index 6afa31f4ccde6..3364446862b22 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h @@ -87,8 +87,8 @@ public: } bool is_end() const { - assert(leaf.pos <= leaf.node->get_size()); - return leaf.pos == leaf.node->get_size(); + // external methods may only resolve at a boundary if at end + return at_boundary(); } bool is_begin() const { @@ -134,6 +134,11 @@ public: node_position_t, MAX_DEPTH> internal; node_position_t leaf; + bool at_boundary() const { + assert(leaf.pos <= leaf.node->get_size()); + return leaf.pos == leaf.node->get_size(); + } + depth_t check_split() const { if (!leaf.node->at_max_capacity()) { return 0; -- 2.39.5