]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: disable cursor validation in track_split()
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 9 Oct 2020 06:05:44 +0000 (14:05 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Tue, 1 Dec 2020 04:50:54 +0000 (12:50 +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 eb28b611944716e9def844a26d0a0f14f66ed218..f97e120444e740db3ebc20788e8a0873a5e9f259 100644 (file)
@@ -25,7 +25,7 @@ using node_future = Node::node_future<ValuesT...>;
 tree_cursor_t::tree_cursor_t(Ref<LeafNode> node, const search_position_t& pos)
       : leaf_node{node}, position{pos} {
   assert(!is_end());
-  leaf_node->do_track_cursor(*this);
+  leaf_node->do_track_cursor<true>(*this);
 }
 
 tree_cursor_t::tree_cursor_t(
@@ -34,7 +34,7 @@ tree_cursor_t::tree_cursor_t(
       : leaf_node{node}, position{pos} {
   assert(!is_end());
   update_kv(key, _p_value, v);
-  leaf_node->do_track_cursor(*this);
+  leaf_node->do_track_cursor<true>(*this);
 }
 
 tree_cursor_t::tree_cursor_t(Ref<LeafNode> node)
@@ -59,6 +59,7 @@ const onode_t* tree_cursor_t::get_p_value() const {
   return p_value;
 }
 
+template <bool VALIDATE>
 void tree_cursor_t::update_track(
     Ref<LeafNode> node, const search_position_t& pos) {
   // the cursor must be already untracked
@@ -69,8 +70,10 @@ void tree_cursor_t::update_track(
   position = pos;
   key_view.reset();
   p_value = nullptr;
-  leaf_node->do_track_cursor(*this);
+  leaf_node->do_track_cursor<VALIDATE>(*this);
 }
+template void tree_cursor_t::update_track<true>(Ref<LeafNode>, const search_position_t&);
+template void tree_cursor_t::update_track<false>(Ref<LeafNode>, const search_position_t&);
 
 void tree_cursor_t::update_kv(
     const key_view_t& key, const onode_t* _p_value, layout_version_t v) const {
@@ -709,7 +712,7 @@ Ref<tree_cursor_t> LeafNode::track_insert(
   for (auto& p_cursor : p_cursors) {
     search_position_t new_pos = p_cursor->get_position();
     ++new_pos.index_by_stage(insert_stage);
-    p_cursor->update_track(this, new_pos);
+    p_cursor->update_track<true>(this, new_pos);
   }
 
   // track insert
@@ -726,7 +729,7 @@ void LeafNode::track_split(
   while (iter != tracked_cursors.end()) {
     search_position_t new_pos = iter->first;
     new_pos -= split_pos;
-    iter->second->update_track(right_node, new_pos);
+    iter->second->update_track<false>(right_node, new_pos);
     ++iter;
   }
   tracked_cursors.erase(first, tracked_cursors.end());
index 1364c448306e59a9eba0a27ee95cea65ac520785..040acb17e5a7c6b9081f67603f2cfaa8c7440914 100644 (file)
@@ -62,6 +62,7 @@ class tree_cursor_t final
   tree_cursor_t(Ref<LeafNode>);
   const search_position_t& get_position() const { return position; }
   Ref<LeafNode> get_leaf_node() { return leaf_node; }
+  template <bool VALIDATE>
   void update_track(Ref<LeafNode>, const search_position_t&);
   void update_kv(const key_view_t&, const onode_t*, layout_version_t) const;
   void ensure_kv() const;
@@ -262,8 +263,11 @@ class LeafNode final : public Node {
   layout_version_t get_layout_version() const { return layout_version; }
   std::tuple<key_view_t, const onode_t*, layout_version_t> get_kv(
       const search_position_t&) const;
+  template <bool VALIDATE>
   void do_track_cursor(tree_cursor_t& cursor) {
-    validate_cursor(cursor);
+    if constexpr (VALIDATE) {
+      validate_cursor(cursor);
+    }
     auto& cursor_pos = cursor.get_position();
     assert(tracked_cursors.find(cursor_pos) == tracked_cursors.end());
     tracked_cursors[cursor_pos] = &cursor;