From: Yingxin Cheng Date: Thu, 3 Jun 2021 02:28:50 +0000 (+0800) Subject: crimson/onode-staged-tree: pass node_size into node_extent_t X-Git-Tag: v17.1.0~1674^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2258730bee80adff02e336cb938e7f92ef75b15a;p=ceph.git crimson/onode-staged-tree: pass node_size into node_extent_t Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h index 1bb1aeaa150aa..3be6fb958303c 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h @@ -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(node.get_read())); + node_stage_t stage(reinterpret_cast(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(extent->get_read())} { + node_stage{reinterpret_cast(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(extent->get_read())); + node_stage = node_stage_t(reinterpret_cast(extent->get_read()), + extent->get_length()); assert(recorder == static_cast(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(extent->get_read())); + node_stage = node_stage_t(reinterpret_cast(extent->get_read()), + extent->get_length()); state = nextent_state_t::FRESH; mut.emplace(fresh_mut); recorder = nullptr; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h index 4d74b8beab3b8..82ee606fd4630 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h @@ -765,7 +765,8 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { STAGE_T::template get_largest_slot( extent.read(), &cast_down_fill_0(last_pos), nullptr, nullptr); } else { - node_stage_t right_stage{reinterpret_cast(right_mut.get_write())}; + node_stage_t right_stage{reinterpret_cast(right_mut.get_write()), + right_mut.get_length()}; STAGE_T::template get_largest_slot( right_stage, &cast_down_fill_0(last_pos), nullptr, nullptr); } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h index 581298459076c..769c66d6547f3 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/item_iterator_stage.h @@ -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); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage.h index 2c55e58477052..981e393c85d6d 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage.h @@ -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(p_node_start)); + return node_extent_t( + reinterpret_cast(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 diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h index 31803c71af829..8b57562fca79b 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/stage.h @@ -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; diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h index e9fba2fdb7d1f..81f60f6e5b760 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/sub_items_stage.h @@ -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;