From: Samuel Just Date: Mon, 25 Oct 2021 06:14:08 +0000 (+0000) Subject: crimson/os/seastore/lba_manager/lba_btree: factor out iterator::handle_boundary X-Git-Tag: v17.1.0~607^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=505492844c0ebf8567d33296b75e402f286ebe57;p=ceph.git crimson/os/seastore/lba_manager/lba_btree: factor out iterator::handle_boundary Factor out helper to adjust iterators at_boundary(). Signed-off-by: Samuel Just --- 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 a1a324f62d20b..ba166fb127ad0 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc @@ -21,21 +21,11 @@ LBABtree::mkfs_ret LBABtree::mkfs(op_context_t c) return lba_root_t{root_leaf->get_paddr(), 1u}; } -LBABtree::iterator_fut LBABtree::iterator::next( +LBABtree::iterator::handle_boundary_ret LBABtree::iterator::handle_boundary( op_context_t c, - mapped_space_visitor_t *visitor) const + mapped_space_visitor_t *visitor) { - assert_valid(); - assert(!is_end()); - - if ((leaf.pos + 1) < leaf.node->get_size()) { - auto ret = *this; - ret.leaf.pos++; - return iterator_fut( - interruptible::ready_future_marker{}, - ret); - } - + assert(at_boundary()); depth_t depth_with_space = 2; for (; depth_with_space <= get_depth(); ++depth_with_space) { if ((get_internal(depth_with_space).pos + 1) < @@ -46,29 +36,49 @@ LBABtree::iterator_fut LBABtree::iterator::next( if (depth_with_space <= get_depth()) { return seastar::do_with( - *this, [](const LBAInternalNode &internal) { return internal.begin(); }, [](const LBALeafNode &leaf) { return leaf.begin(); }, - [c, depth_with_space, visitor](auto &ret, auto &li, auto &ll) { + [this, c, depth_with_space, visitor](auto &li, auto &ll) { for (depth_t depth = 2; depth < depth_with_space; ++depth) { - ret.get_internal(depth).reset(); + get_internal(depth).reset(); } - ret.leaf.reset(); - ret.get_internal(depth_with_space).pos++; + leaf.reset(); + get_internal(depth_with_space).pos++; return lookup_depth_range( - c, ret, depth_with_space - 1, 0, li, ll, visitor + c, *this, depth_with_space - 1, 0, li, ll, visitor + ); + }); + } else { + // end + return seastar::now(); + } +} + +LBABtree::iterator_fut LBABtree::iterator::next( + op_context_t c, + mapped_space_visitor_t *visitor) const +{ + assert_valid(); + assert(!is_end()); + + auto ret = *this; + ret.leaf.pos++; + if (ret.at_boundary()) { + return seastar::do_with( + ret, + [c, visitor](auto &ret) mutable { + return ret.handle_boundary( + c, visitor ).si_then([&ret] { return std::move(ret); }); }); } else { - // end - auto ret = *this; - ret.leaf.pos = ret.leaf.node->get_size(); return iterator_fut( interruptible::ready_future_marker{}, ret); } + } LBABtree::iterator_fut LBABtree::iterator::prev(op_context_t c) const 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 3364446862b22..10ec1a6b04c62 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h @@ -139,6 +139,12 @@ public: return leaf.pos == leaf.node->get_size(); } + using handle_boundary_ertr = base_iertr; + using handle_boundary_ret = handle_boundary_ertr::future<>; + handle_boundary_ret handle_boundary( + op_context_t c, + mapped_space_visitor_t *visitor); + depth_t check_split() const { if (!leaf.node->at_max_capacity()) { return 0;