]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: pass node_size into node_extent_t
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 3 Jun 2021 02:28:50 +0000 (10:28 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Fri, 11 Jun 2021 14:43:58 +0000 (22:43 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h
src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h

index 1bb1aeaa150aaed2856df92ec40be1d170c21b86..3be6fb958303cea633de7262daf249c8a515884f 100644 (file)
@@ -113,7 +113,8 @@ class DeltaRecorderT final: public DeltaRecorder {
                    laddr_t node_laddr) override {
     LOG_PREFIX(OTree::Extent::Replay);
     assert(is_empty());
-    node_stage_t stage(reinterpret_cast<const FieldType*>(node.get_read()));
+    node_stage_t stage(reinterpret_cast<const FieldType*>(node.get_read()),
+                       node.get_length());
     node_delta_op_t op;
     try {
       ceph::decode(op, delta);
@@ -136,14 +137,16 @@ class DeltaRecorderT final: public DeltaRecorder {
       }
       case node_delta_op_t::SPLIT: {
         DEBUG("decoding SPLIT ...");
-        auto split_at = StagedIterator::decode(stage.p_start(), delta);
+        auto split_at = StagedIterator::decode(
+            node.get_read(), node.get_length(), delta);
         DEBUG("apply split_at={} ...", split_at);
         layout_t::split(node, stage, split_at);
         break;
       }
       case node_delta_op_t::SPLIT_INSERT: {
         DEBUG("decoding SPLIT_INSERT ...");
-        auto split_at = StagedIterator::decode(stage.p_start(), delta);
+        auto split_at = StagedIterator::decode(
+            node.get_read(), node.get_length(), delta);
         auto key = key_hobj_t::decode(delta);
         auto value = decode_value(delta);
         auto insert_pos = position_t::decode(delta);
@@ -280,7 +283,8 @@ class NodeExtentAccessorT {
 
   NodeExtentAccessorT(NodeExtentRef extent)
       : extent{extent},
-        node_stage{reinterpret_cast<const FieldType*>(extent->get_read())} {
+        node_stage{reinterpret_cast<const FieldType*>(extent->get_read()),
+                   extent->get_length()} {
     if (extent->is_initial_pending()) {
       state = nextent_state_t::FRESH;
       mut.emplace(extent->get_mutable());
@@ -348,8 +352,8 @@ class NodeExtentAccessorT {
       extent = extent->mutate(c, std::move(ref_recorder));
       state = nextent_state_t::MUTATION_PENDING;
       assert(extent->is_mutation_pending());
-      node_stage = node_stage_t(
-          reinterpret_cast<const FieldType*>(extent->get_read()));
+      node_stage = node_stage_t(reinterpret_cast<const FieldType*>(extent->get_read()),
+                                extent->get_length());
       assert(recorder == static_cast<recorder_t*>(extent->get_recorder()));
       mut.emplace(extent->get_mutable());
     }
@@ -525,8 +529,8 @@ class NodeExtentAccessorT {
       NodeExtentRef to_discard = extent;
 
       extent = fresh_extent;
-      node_stage = node_stage_t(
-          reinterpret_cast<const FieldType*>(extent->get_read()));
+      node_stage = node_stage_t(reinterpret_cast<const FieldType*>(extent->get_read()),
+                                extent->get_length());
       state = nextent_state_t::FRESH;
       mut.emplace(fresh_mut);
       recorder = nullptr;
index 4d74b8beab3b8c12c2e64c2be17bf4d62c7c4438..82ee606fd4630c9bf894dff22605dcc5a365b789 100644 (file)
@@ -765,7 +765,8 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl {
       STAGE_T::template get_largest_slot<true, false, false>(
           extent.read(), &cast_down_fill_0<STAGE>(last_pos), nullptr, nullptr);
     } else {
-      node_stage_t right_stage{reinterpret_cast<FieldType*>(right_mut.get_write())};
+      node_stage_t right_stage{reinterpret_cast<FieldType*>(right_mut.get_write()),
+                               right_mut.get_length()};
       STAGE_T::template get_largest_slot<true, false, false>(
           right_stage, &cast_down_fill_0<STAGE>(last_pos), nullptr, nullptr);
     }
index 581298459076cc5fa9b590be3c5a9433b5b0b565..769c66d6547f331fb46b8823e1edae94a39a467f 100644 (file)
@@ -98,6 +98,7 @@ class item_iterator_t {
   }
 
   static item_iterator_t decode(const char* p_node_start,
+                                extent_len_t node_size,
                                 ceph::bufferlist::const_iterator& delta) {
     node_offset_t start_offset;
     ceph::decode(start_offset, delta);
index 2c55e58477052b9692192c30ee7b7441bcaaa803..981e393c85d6d23d954e38c6c6250269baf3c88c 100644 (file)
@@ -34,7 +34,10 @@ class node_extent_t {
   // TODO: remove
   node_extent_t() = default;
 
-  node_extent_t(const FieldType* p_fields) : p_fields{p_fields} {
+  node_extent_t(const FieldType* p_fields, extent_len_t node_size)
+      : p_fields{p_fields}, node_size{node_size} {
+    assert(node_size <= MAX_NODE_SIZE);
+    assert(node_size % DISK_BLOCK_SIZE == 0);
     validate(*p_fields);
   }
 
@@ -110,9 +113,12 @@ class node_extent_t {
   }
 
   static node_extent_t decode(const char* p_node_start,
+                              extent_len_t node_size,
                               ceph::bufferlist::const_iterator& delta) {
     // nothing to decode
-    return node_extent_t(reinterpret_cast<const FieldType*>(p_node_start));
+    return node_extent_t(
+        reinterpret_cast<const FieldType*>(p_node_start),
+        node_size);
   }
 
   static void validate(const FieldType& fields) {
@@ -182,6 +188,7 @@ class node_extent_t {
  private:
   const FieldType& fields() const { return *p_fields; }
   const FieldType* p_fields;
+  extent_len_t node_size;
 };
 
 template <typename FieldType, node_type_t NODE_TYPE>
index 31803c71af829adcc77933fc894911e797e6bb2c..8b57562fca79be4eb7bd26ab0ab149256ef691ca 100644 (file)
@@ -214,7 +214,7 @@ struct staged {
     *   (!IS_BOTTOM) size_to_nxt_at(index_t) const -> node_offset_t
     *   (!IS_BOTTOM) get_nxt_container(index_t) const
     *   encode(p_node_start, encoded)
-    *   decode(p_node_start, delta) -> container_t
+    *   decode(p_node_start, node_size, delta) -> container_t
     * static:
     *   header_size() -> node_offset_t
     *   estimate_insert(key, value) -> node_offset_t
@@ -480,8 +480,10 @@ struct staged {
     }
 
     static me_t decode(const char* p_node_start,
+                       extent_len_t node_size,
                        ceph::bufferlist::const_iterator& delta) {
-      auto container = container_t::decode(p_node_start, delta);
+      auto container = container_t::decode(
+          p_node_start, node_size, delta);
       auto ret = me_t(container);
       index_t index;
       ceph::decode(index, delta);
@@ -517,7 +519,7 @@ struct staged {
      *   get_nxt_container() const
      *   has_next() const -> bool
      *   encode(p_node_start, encoded)
-     *   decode(p_node_start, delta) -> container_t
+     *   decode(p_node_start, node_length, delta) -> container_t
      *   operator++()
      * static:
      *   header_size() -> node_offset_t
@@ -817,8 +819,10 @@ struct staged {
     }
 
     static me_t decode(const char* p_node_start,
+                       extent_len_t node_size,
                        ceph::bufferlist::const_iterator& delta) {
-      auto container = container_t::decode(p_node_start, delta);
+      auto container = container_t::decode(
+          p_node_start, node_size, delta);
       auto ret = me_t(container);
       uint8_t is_end;
       ceph::decode(is_end, delta);
@@ -886,7 +890,7 @@ struct staged {
    *   (!IS_BOTTOM)get_appender_opened(p_mut) -> Appender
    * denc:
    *   encode(p_node_start, encoded)
-   *   decode(p_node_start, delta) -> iterator_t
+   *   decode(p_node_start, node_size, delta) -> iterator_t
    * static:
    *   header_size() -> node_offset_t
    *   estimate_insert(key, value) -> node_offset_t
@@ -1707,14 +1711,17 @@ struct staged {
       }
     }
     static StagedIterator decode(const char* p_node_start,
+                                 extent_len_t node_size,
                                  ceph::bufferlist::const_iterator& delta) {
       StagedIterator ret;
       uint8_t present;
       ceph::decode(present, delta);
       if (present) {
-        ret.iter = iterator_t::decode(p_node_start, delta);
+        ret.iter = iterator_t::decode(
+            p_node_start, node_size, delta);
         if constexpr (!IS_BOTTOM) {
-          ret._nxt = NXT_STAGE_T::StagedIterator::decode(p_node_start, delta);
+          ret._nxt = NXT_STAGE_T::StagedIterator::decode(
+              p_node_start, node_size, delta);
         }
       }
       return ret;
index e9fba2fdb7d1f9680760b53d6614e89a6c645d95..81f60f6e5b760b7750dd0c0415181c7e90cf598f 100644 (file)
@@ -83,7 +83,9 @@ class internal_sub_items_t {
   }
 
   static internal_sub_items_t decode(
-      const char* p_node_start, ceph::bufferlist::const_iterator& delta) {
+      const char* p_node_start,
+      extent_len_t node_size,
+      ceph::bufferlist::const_iterator& delta) {
     node_offset_t start_offset;
     ceph::decode(start_offset, delta);
     node_offset_t end_offset;
@@ -250,7 +252,9 @@ class leaf_sub_items_t {
   }
 
   static leaf_sub_items_t decode(
-      const char* p_node_start, ceph::bufferlist::const_iterator& delta) {
+      const char* p_node_start,
+      extent_len_t node_size,
+      ceph::bufferlist::const_iterator& delta) {
     node_offset_t start_offset;
     ceph::decode(start_offset, delta);
     node_offset_t end_offset;