]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: don't validate child when it's outdated
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 23 Apr 2021 01:25:29 +0000 (09:25 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 29 Apr 2021 08:03:37 +0000 (16:03 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node.h

index 2096fa5eecbdd851b2e2143fe9d60badf5926198..84c34fe824647caafcf0d048790e5e3459eb62a2 100644 (file)
@@ -1355,14 +1355,16 @@ node_future<Ref<InternalNode>> 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<false>(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<Ref<InternalNode>> 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<false>(insert_pos, insert_stage, insert_child);
+      } else {
+        right_node->template track_insert<false>(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<Ref<Node>> InternalNode::get_or_track_child(
   });
 }
 
+template <bool VALIDATE>
 void InternalNode::track_insert(
       const search_position_t& insert_pos, match_stage_t insert_stage,
       Ref<Node> insert_child, Ref<Node> 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<VALIDATE>(_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<true>(const search_position_t&, match_stage_t, Ref<Node>, Ref<Node>);
+template void InternalNode::track_insert<false>(const search_position_t&, match_stage_t, Ref<Node>, Ref<Node>);
 
 void InternalNode::replace_track(
     Ref<Node> new_child, Ref<Node> old_child, bool is_new_child_outdated)
index 2f4df94c825ccd5e035c763e761ad8b4312d5614..3940c2220410c6a49fb82506010e54572972d945 100644 (file)
@@ -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<Ref<Node>> get_or_track_child(context_t, const search_position_t&, laddr_t);
+  template <bool VALIDATE = true>
   void track_insert(
       const search_position_t&, match_stage_t, Ref<Node>, Ref<Node> nxt_child = nullptr);
   void replace_track(Ref<Node> new_child, Ref<Node> old_child, bool);