]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: decouple NodeExtentMutable from NodeExtent
authorYingxin Cheng <yingxin.cheng@intel.com>
Fri, 15 Jan 2021 03:25:12 +0000 (11:25 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 21 Jan 2021 05:27:45 +0000 (13:27 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/CMakeLists.txt
src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_mutable.cc [deleted file]
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_mutable.h

index 77f8465cf9a665bcf64dd815f8b957f6fbbf87d6..ceffe209b4a4665182f0b052098318256329f305 100644 (file)
@@ -18,7 +18,6 @@ add_library(crimson-seastore STATIC
   onode_manager/staged-fltree/node.cc
   onode_manager/staged-fltree/node_extent_manager.cc
   onode_manager/staged-fltree/node_extent_manager/seastore.cc
-  onode_manager/staged-fltree/node_extent_mutable.cc
   onode_manager/staged-fltree/node_impl.cc
   onode_manager/staged-fltree/stages/item_iterator_stage.cc
   onode_manager/staged-fltree/stages/key_layout.cc
index d08a990151ebe2ea3368753a81529cbf44a9de7e..4d323c05ce9a5cfe569f0385d649c24eb1d250c1 100644 (file)
@@ -32,7 +32,8 @@ class DeltaRecorder {
   virtual node_type_t node_type() const = 0;
   virtual field_type_t field_type() const = 0;
   virtual void apply_delta(ceph::bufferlist::const_iterator&,
-                           NodeExtentMutable&) = 0;
+                           NodeExtentMutable&,
+                           laddr_t) = 0;
 
  protected:
   DeltaRecorder() = default;
index 94782f50d4d9bbd4cf047290b8590152de076052..6f1b95e499dfcaa3d9828205e45a574b4595cb58 100644 (file)
@@ -99,7 +99,8 @@ class DeltaRecorderT final: public DeltaRecorder {
   node_type_t node_type() const override { return NODE_TYPE; }
   field_type_t field_type() const override { return FIELD_TYPE; }
   void apply_delta(ceph::bufferlist::const_iterator& delta,
-                   NodeExtentMutable& node) override {
+                   NodeExtentMutable& node,
+                   laddr_t node_laddr) override {
     assert(is_empty());
     node_stage_t stage(reinterpret_cast<const FieldType*>(node.get_read()));
     op_t op;
@@ -169,12 +170,12 @@ class DeltaRecorderT final: public DeltaRecorder {
       }
       default:
         logger().error("OTree::Extent::Replay: got unknown op {} when replay {:#x}",
-                       op, node.get_laddr());
+                       op, node_laddr);
         ceph_abort();
       }
     } catch (buffer::error& e) {
       logger().error("OTree::Extent::Replay: got decode error {} when replay {:#x}",
-                     e, node.get_laddr());
+                     e, node_laddr);
       ceph_abort();
     }
   }
index 77b230e035fc9ebe43cd4939f89cc8570498e254..06a2f511f68f60a1093fb8bd5862144d72354f40 100644 (file)
@@ -41,7 +41,9 @@ class NodeExtent : public LogicalCachedExtent {
   NodeExtent(T&&... t) : LogicalCachedExtent(std::forward<T>(t)...) {}
 
   NodeExtentMutable do_get_mutable() {
-    return NodeExtentMutable(*this);
+    assert(is_pending() || // during mutation
+           is_clean());    // during replay
+    return NodeExtentMutable(get_bptr().c_str(), get_length());
   }
 
   /**
@@ -51,9 +53,6 @@ class NodeExtent : public LogicalCachedExtent {
    * - CacheExtent::get_delta() -> ceph::bufferlist
    * - LogicalCachedExtent::apply_delta(const ceph::bufferlist) -> void
    */
-
- private:
-  friend class NodeExtentMutable;
 };
 
 using crimson::os::seastore::TransactionManager;
index 8d88485bf7295512c0dfce25e9fe256339c265cb..c3d9ba0c45b7f1d5c48fbf8bd3ca7adf120534e9 100644 (file)
@@ -81,7 +81,7 @@ void SeastoreNodeExtent::apply_delta(const ceph::bufferlist& bl) {
   auto node = do_get_mutable();
   auto p = bl.cbegin();
   while (p != bl.end()) {
-    recorder->apply_delta(p, node);
+    recorder->apply_delta(p, node, get_laddr());
   }
 }
 
index 240c8893281f3458ab5e6fe2d08954d628ac6a9e..7f46ac96f015c98539e2639b2b137736bef2b3e3 100644 (file)
@@ -30,7 +30,7 @@ class TestReplayExtent final: public NodeExtent {
     auto bl = recorder->get_delta();
     assert(bl.length());
     auto p = bl.cbegin();
-    recorder->apply_delta(p, mut);
+    recorder->apply_delta(p, mut, 0u);
     assert(p == bl.end());
     auto cmp = std::memcmp(get_read(), replayed_extent->get_read(), get_length());
     ceph_assert(cmp == 0 && "replay mismatch!");
diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_mutable.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_mutable.cc
deleted file mode 100644 (file)
index 048c400..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
-// vim: ts=8 sw=2 smarttab
-
-#include "node_extent_mutable.h"
-#include "node_extent_manager.h"
-
-namespace crimson::os::seastore::onode {
-
-NodeExtentMutable::NodeExtentMutable(NodeExtent& extent)
-    : extent{extent} {
-  assert(extent.is_pending() ||  // during mutation
-         extent.is_clean());     // during replay
-}
-
-const char* NodeExtentMutable::get_read() const {
-  assert(extent.is_pending() ||  // during mutation
-         extent.is_clean());     // during replay
-  return extent.get_bptr().c_str();
-}
-
-char* NodeExtentMutable::get_write() {
-  assert(extent.is_pending() ||  // during mutation
-         extent.is_clean());     // during replay
-  return extent.get_bptr().c_str();
-}
-
-extent_len_t NodeExtentMutable::get_length() const {
-  return extent.get_length();
-}
-
-laddr_t NodeExtentMutable::get_laddr() const {
-  return extent.get_laddr();
-}
-
-const char* NodeExtentMutable::buf_upper_bound() const {
-  return get_read() + get_length();
-}
-
-}
index 52f10a013003093d786ca3a5b90a7df96dfd428b..0a55020832e38bf611dd2ca7c8ba24488164cbee 100644 (file)
@@ -9,8 +9,6 @@
 
 namespace crimson::os::seastore::onode {
 
-class NodeExtent;
-
 /**
  * NodeExtentMutable
  *
@@ -21,8 +19,7 @@ class NodeExtent;
 class NodeExtentMutable {
  public:
   void copy_in_absolute(void* dst, const void* src, extent_len_t len) {
-    assert((char*)dst >= get_write());
-    assert((char*)dst + len <= buf_upper_bound());
+    assert(is_safe(dst, len));
     std::memcpy(dst, src, len);
   }
   template <typename T>
@@ -44,11 +41,9 @@ class NodeExtentMutable {
   }
 
   void shift_absolute(const void* src, extent_len_t len, int offset) {
-    assert((const char*)src >= get_write());
-    assert((const char*)src + len <= buf_upper_bound());
+    assert(is_safe(src, len));
     char* to = (char*)src + offset;
-    assert(to >= get_write());
-    assert(to + len <= buf_upper_bound());
+    assert(is_safe(to, len));
     if (len != 0) {
       std::memmove(to, src, len);
     }
@@ -59,20 +54,23 @@ class NodeExtentMutable {
 
   template <typename T>
   void validate_inplace_update(const T& updated) {
-    assert((const char*)&updated >= get_write());
-    assert((const char*)&updated + sizeof(T) <= buf_upper_bound());
+    assert(is_safe(&updated, sizeof(T)));
   }
 
-  const char* get_read() const;
-  char* get_write();
-  extent_len_t get_length() const;
-  laddr_t get_laddr() const;
+  const char* get_read() const { return p_start; }
+  char* get_write() { return p_start; }
+  extent_len_t get_length() const { return length; }
 
  private:
-  explicit NodeExtentMutable(NodeExtent&);
-  const char* buf_upper_bound() const;
+  NodeExtentMutable(char* p_start, extent_len_t length)
+    : p_start{p_start}, length{length} {}
+  bool is_safe(const void* src, extent_len_t len) const {
+    return ((const char*)src >= p_start) &&
+           ((const char*)src + len <= p_start + length);
+  }
 
-  NodeExtent& extent;
+  char* p_start;
+  extent_len_t length;
 
   friend class NodeExtent;
 };