From: Yingxin Cheng Date: Fri, 16 Apr 2021 05:45:09 +0000 (+0800) Subject: crimson/onode-staged-tree: implement staged::get_prev_slot() X-Git-Tag: v17.1.0~2110^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6291154e4caf82fe95ede4938100753e4909ea36;p=ceph.git crimson/onode-staged-tree: implement staged::get_prev_slot() Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h index 9097c4bf7546..3583ab2e4dda 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h @@ -378,7 +378,24 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { void get_prev_slot(search_position_t& pos, key_view_t* p_index_key = nullptr, const value_t** pp_value = nullptr) const override { - ceph_abort("not implemented"); + assert(!is_keys_empty()); + assert(!pos.is_end()); + auto& _pos = cast_down(pos); +#ifndef NDEBUG + auto nxt_pos = _pos; +#endif + if (!p_index_key && pp_value) { + STAGE_T::template get_prev_slot( + extent.read(), _pos, nullptr, pp_value); + } else { + ceph_abort("not implemented"); + } +#ifndef NDEBUG + auto _nxt_pos = _pos; + STAGE_T::template get_next_slot( + extent.read(), _nxt_pos, nullptr, nullptr); + assert(nxt_pos == _nxt_pos); +#endif } void get_next_slot(search_position_t& pos, 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 a6f439ca63bf..31803c71af82 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 @@ -1545,6 +1545,49 @@ struct staged { } } + template + static void get_prev_slot( + const container_t& container, // IN + position_t& pos, // IN&OUT + full_key_t* p_index_key, // OUT + const value_t** pp_value) { // OUT + assert(pos != position_t::begin()); + assert(!pos.is_end()); + auto& index = pos.index; + auto iter = iterator_t(container); + if constexpr (!IS_BOTTOM) { + auto& nxt_pos = pos.nxt; + if (nxt_pos == NXT_STAGE_T::position_t::begin()) { + assert(index); + --index; + iter.seek_at(index); + auto nxt_container = iter.get_nxt_container(); + NXT_STAGE_T::template get_largest_slot( + nxt_container, &nxt_pos, p_index_key, pp_value); + } else { + iter.seek_at(index); + auto nxt_container = iter.get_nxt_container(); + NXT_STAGE_T::template get_prev_slot( + nxt_container, nxt_pos, p_index_key, pp_value); + } + } else { + assert(index); + --index; + iter.seek_at(index); + if constexpr (GET_VAL) { + assert(pp_value); + *pp_value = iter.get_p_value(); + } else { + assert(!pp_value); + } + } + if constexpr (GET_KEY) { + p_index_key->set(iter.get_key()); + } else { + assert(!p_index_key); + } + } + struct _BaseEmpty {}; class _BaseWithNxtIterator { protected: