From e0a9bfbcfa3af1997b11ce997a0e3b892bdc33d4 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 23 Apr 2021 09:25:29 +0800 Subject: [PATCH] crimson/onode-staged-tree: don't validate child when it's outdated Signed-off-by: Yingxin Cheng --- .../onode_manager/staged-fltree/node.cc | 25 +++++++++++++------ .../onode_manager/staged-fltree/node.h | 1 + 2 files changed, 19 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 2096fa5eecbdd..84c34fe824647 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc @@ -1355,14 +1355,16 @@ node_future> InternalNode::insert_or_split( assert(impl->free_size() == free_size - insert_size); assert(insert_pos <= pos); assert(p_value->value == insert_value); - track_insert(insert_pos, insert_stage, insert_child); if (outdated_child) { + track_insert(insert_pos, insert_stage, insert_child); // untrack the inaccurate child after updated its position // before validate, and before fix_index() validate_child_inconsistent(*outdated_child); // we will need its parent_info valid for the following fix_index() do_untrack_child(*outdated_child); + } else { + track_insert(insert_pos, insert_stage, insert_child); } validate_tracked_children(); @@ -1391,19 +1393,25 @@ node_future> InternalNode::insert_or_split( insert_pos, insert_stage, insert_size); assert(p_value->value == insert_value); track_split(split_pos, right_node); - if (is_insert_left) { - track_insert(insert_pos, insert_stage, insert_child); - } else { - right_node->track_insert(insert_pos, insert_stage, insert_child); - } if (outdated_child) { + if (is_insert_left) { + track_insert(insert_pos, insert_stage, insert_child); + } else { + right_node->template track_insert(insert_pos, insert_stage, insert_child); + } // untrack the inaccurate child after updated its position // before validate, and before fix_index() auto& _parent = outdated_child->parent_info().ptr; _parent->validate_child_inconsistent(*outdated_child); // we will need its parent_info valid for the following fix_index() _parent->do_untrack_child(*outdated_child); + } else { + if (is_insert_left) { + track_insert(insert_pos, insert_stage, insert_child); + } else { + right_node->track_insert(insert_pos, insert_stage, insert_child); + } } validate_tracked_children(); @@ -1440,6 +1448,7 @@ node_future> InternalNode::get_or_track_child( }); } +template void InternalNode::track_insert( const search_position_t& insert_pos, match_stage_t insert_stage, Ref insert_child, Ref nxt_child) @@ -1458,7 +1467,7 @@ void InternalNode::track_insert( auto _pos = node->parent_info().position; assert(!_pos.is_end()); ++_pos.index_by_stage(insert_stage); - node->as_child(_pos, this); + node->as_child(_pos, this); } // track insert insert_child->as_child(insert_pos, this); @@ -1472,6 +1481,8 @@ void InternalNode::track_insert( } #endif } +template void InternalNode::track_insert(const search_position_t&, match_stage_t, Ref, Ref); +template void InternalNode::track_insert(const search_position_t&, match_stage_t, Ref, Ref); void InternalNode::replace_track( Ref new_child, Ref old_child, bool is_new_child_outdated) 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 2f4df94c825cc..3940c2220410c 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.h @@ -572,6 +572,7 @@ class InternalNode final : public Node { // XXX: extract a common tracker for InternalNode to track Node, // and LeafNode to track tree_cursor_t. node_future> get_or_track_child(context_t, const search_position_t&, laddr_t); + template void track_insert( const search_position_t&, match_stage_t, Ref, Ref nxt_child = nullptr); void replace_track(Ref new_child, Ref old_child, bool); -- 2.39.5