From 2c48d25d1991c9b575d7d83c92cfc1c26b47cc58 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 2 Sep 2021 11:05:18 +0800 Subject: [PATCH] crimson/onode-staged-tree: implement hint in NodeImpl::rebuild_extent() Get the hint from its first key when rebuilding a node extent. Signed-off-by: Yingxin Cheng --- .../os/seastore/onode_manager/staged-fltree/node.cc | 6 +++--- src/crimson/os/seastore/onode_manager/staged-fltree/node.h | 2 +- .../os/seastore/onode_manager/staged-fltree/node_impl.h | 2 +- .../os/seastore/onode_manager/staged-fltree/node_layout.h | 7 ++++++- src/test/crimson/seastore/onode_tree/test_staged_fltree.cc | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc index 4171490e63931..1fec53bcfa9da 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc @@ -605,7 +605,7 @@ Node::try_merge_adjacent( // so use rebuild_extent() as a workaround to rebuild the node from a // fresh extent, thus no need to generate delta. auto left_addr = left_for_merge->impl->laddr(); - return left_for_merge->rebuild_extent(c, L_ADDR_MIN + return left_for_merge->rebuild_extent(c ).si_then([c, update_index_after_merge, left_addr, merge_stage = merge_stage, @@ -744,7 +744,7 @@ eagain_ifuture> Node::load( }); } -eagain_ifuture Node::rebuild_extent(context_t c, laddr_t hint) +eagain_ifuture Node::rebuild_extent(context_t c) { LOG_PREFIX(OTree::Node::rebuild_extent); DEBUGT("{} ...", c.t, get_name()); @@ -753,7 +753,7 @@ eagain_ifuture Node::rebuild_extent(context_t c, laddr_t hint // note: laddr can be changed after rebuild, but we don't fix the parent // mapping as it is part of the merge process. - return impl->rebuild_extent(c, hint); + return impl->rebuild_extent(c); } eagain_ifuture<> Node::retire(context_t c, Ref&& this_ref) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node.h index 6392da50d37f1..c02a24d50ff9f 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.h @@ -428,7 +428,7 @@ class Node eagain_ifuture<> erase_node(context_t, Ref&&); template eagain_ifuture<> fix_parent_index(context_t, Ref&&, bool); - eagain_ifuture rebuild_extent(context_t, laddr_t); + eagain_ifuture rebuild_extent(context_t); eagain_ifuture<> retire(context_t, Ref&&); void make_tail(context_t); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h index f8a8aaa1cd4bd..cf452618b6fa1 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h @@ -90,7 +90,7 @@ class NodeImpl { virtual std::tuple erase(const search_position_t&) = 0; virtual std::tuple evaluate_merge(NodeImpl&) = 0; virtual search_position_t merge(NodeExtentMutable&, NodeImpl&, match_stage_t, extent_len_t) = 0; - virtual eagain_ifuture rebuild_extent(context_t, laddr_t) = 0; + virtual eagain_ifuture rebuild_extent(context_t) = 0; virtual eagain_ifuture<> retire_extent(context_t) = 0; virtual search_position_t make_tail() = 0; 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 cc1841ce9fbf9..436f883700a5f 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 @@ -306,7 +306,12 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { } eagain_ifuture - rebuild_extent(context_t c, laddr_t hint) override { + rebuild_extent(context_t c) override { + assert(!is_keys_empty()); + full_key_t first_index; + STAGE_T::template get_slot( + extent.read(), position_t::begin(), &first_index, nullptr); + auto hint = first_index.get_hint(); return extent.rebuild(c, hint).si_then([this] (auto mut) { // addr may change build_name(); diff --git a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc index 771e5b0356904..a2ef111c87480 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -908,7 +908,7 @@ class DummyChildPool { ceph_abort("impossible path"); } search_position_t merge(NodeExtentMutable&, NodeImpl&, match_stage_t, extent_len_t) override { ceph_abort("impossible path"); } - eagain_ifuture rebuild_extent(context_t, laddr_t) override { + eagain_ifuture rebuild_extent(context_t) override { ceph_abort("impossible path"); } node_stats_t get_stats() const override { ceph_abort("impossible path"); } -- 2.39.5