From: Yingxin Cheng Date: Wed, 2 Dec 2020 14:46:35 +0000 (+0800) Subject: crimson/onode-staged-tree: rename NodeExtentT to NodeExtentAccessorT X-Git-Tag: v16.1.0~359^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=baf0ac214747e7acde49b00404ba4323e2d24954;p=ceph.git crimson/onode-staged-tree: rename NodeExtentT to NodeExtentAccessorT Also renamed file name and added class comments. 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 new file mode 100644 index 000000000000..0c97b9211c60 --- /dev/null +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h @@ -0,0 +1,224 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "node_extent_manager.h" +#include "node_delta_recorder.h" +#include "node_layout_replayable.h" + +namespace crimson::os::seastore::onode { + +template +class DeltaRecorderT final: public DeltaRecorder { + public: + using layout_t = NodeLayoutReplayableT; + using position_t = typename layout_t::position_t; + using StagedIterator = typename layout_t::StagedIterator; + using value_t = typename layout_t::value_t; + static constexpr auto FIELD_TYPE = layout_t::FIELD_TYPE; + + ~DeltaRecorderT() override = default; + + template + void encode_insert( + const full_key_t& key, + const value_t& value, + const position_t& insert_pos, + const match_stage_t& insert_stage, + const node_offset_t& insert_size) { + // TODO encode to encoded + } + + void encode_split( + const StagedIterator& split_at, + const char* p_start) { + // TODO encode to encoded + } + + template + void encode_split_insert( + const StagedIterator& split_at, + const full_key_t& key, + const value_t& value, + const position_t& insert_pos, + const match_stage_t& insert_stage, + const node_offset_t& insert_size, + const char* p_start) { + // TODO encode to encoded + } + + void encode_update_child_addr( + const laddr_t new_addr, + const laddr_packed_t* p_addr, + const char* p_start) { + // TODO encode to encoded + } + + static DeltaRecorderURef create() { + return std::unique_ptr(new DeltaRecorderT()); + } + + private: + DeltaRecorderT() = default; + 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 { + assert(is_empty()); + // TODO decode and apply + assert(false && "not implemented"); + } +}; + +/** + * NodeExtentAccessorT + * + * This component is responsible to mutate the underlying NodeExtent, record + * mutation parameters as delta and apply the recorded modifications to the + * NodeExtent. It contains static information about node and field type in + * order to call methods of NodeLayoutReplayable. + */ +template +class NodeExtentAccessorT { + public: + using layout_t = NodeLayoutReplayableT; + using node_stage_t = typename layout_t::node_stage_t; + using position_t = typename layout_t::position_t; + using recorder_t = DeltaRecorderT; + using StagedIterator = typename layout_t::StagedIterator; + using value_t = typename layout_t::value_t; + static constexpr auto FIELD_TYPE = layout_t::FIELD_TYPE; + + NodeExtentAccessorT(NodeExtentRef extent) + : extent{extent}, + node_stage{reinterpret_cast(extent->get_read())} { + if (no_recording()) { + mut.emplace(extent->get_mutable()); + assert(extent->get_recorder() == nullptr); + recorder = nullptr; + } else if (needs_recording()) { + mut.emplace(extent->get_mutable()); + auto p_recorder = extent->get_recorder(); + assert(p_recorder != nullptr); + assert(p_recorder->node_type() == NODE_TYPE); + assert(p_recorder->field_type() == FIELD_TYPE); + recorder = static_cast(p_recorder); + } else if (needs_mutate()) { + // mut is empty + assert(extent->get_recorder() == nullptr || + extent->get_recorder()->is_empty()); + recorder = nullptr; + } else { + ceph_abort("impossible path"); + } + } + ~NodeExtentAccessorT() = default; + NodeExtentAccessorT(const NodeExtentAccessorT&) = delete; + NodeExtentAccessorT(NodeExtentAccessorT&&) = delete; + NodeExtentAccessorT& operator=(const NodeExtentAccessorT&) = delete; + NodeExtentAccessorT& operator=(NodeExtentAccessorT&&) = delete; + + const node_stage_t& read() const { return node_stage; } + laddr_t get_laddr() const { return extent->get_laddr(); } + + // must be called before any mutate attempes. + // for the safety of mixed read and mutate, call before read. + void prepare_mutate(context_t c) { + if (needs_mutate()) { + auto ref_recorder = recorder_t::create(); + recorder = static_cast(ref_recorder.get()); + extent = extent->mutate(c, std::move(ref_recorder)); + assert(needs_recording()); + node_stage = node_stage_t( + reinterpret_cast(extent->get_read())); + assert(recorder == static_cast(extent->get_recorder())); + mut.emplace(extent->get_mutable()); + } + } + + template + const value_t* insert_replayable( + const full_key_t& key, + const value_t& value, + position_t& insert_pos, + match_stage_t& insert_stage, + node_offset_t& insert_size) { + assert(!needs_mutate()); + if (needs_recording()) { + recorder->template encode_insert( + key, value, insert_pos, insert_stage, insert_size); + } + return layout_t::template insert( + *mut, read(), key, value, + insert_pos, insert_stage, insert_size); + } + + void split_replayable(StagedIterator& split_at) { + assert(!needs_mutate()); + if (needs_recording()) { + recorder->encode_split(split_at, read().p_start()); + } + layout_t::split(*mut, read(), split_at); + } + + template + const value_t* split_insert_replayable( + StagedIterator& split_at, + const full_key_t& key, + const value_t& value, + position_t& insert_pos, + match_stage_t& insert_stage, + node_offset_t& insert_size) { + assert(!needs_mutate()); + if (needs_recording()) { + recorder->template encode_split_insert( + split_at, key, value, insert_pos, insert_stage, insert_size, + read().p_start()); + } + return layout_t::template split_insert( + *mut, read(), split_at, key, value, + insert_pos, insert_stage, insert_size); + } + + void update_child_addr_replayable( + const laddr_t new_addr, laddr_packed_t* p_addr) { + assert(!needs_mutate()); + if (needs_recording()) { + recorder->encode_update_child_addr(new_addr, p_addr, read().p_start()); + } + return layout_t::update_child_addr(*mut, new_addr, p_addr); + } + + void test_copy_to(NodeExtentMutable& to) const { + assert(extent->get_length() == to.get_length()); + std::memcpy(to.get_write(), extent->get_read(), extent->get_length()); + } + + private: + /** + * Possible states with CachedExtent::extent_state_t: + * INITIAL_WRITE_PENDING -- can mutate, no recording + * MUTATION_PENDING -- can mutate, needs recording + * CLEAN/DIRTY -- pending mutate + * INVALID -- impossible + */ + bool no_recording() const { + return extent->is_initial_pending(); + } + bool needs_recording() const { + return extent->is_mutation_pending(); + } + bool needs_mutate() const { + assert(extent->is_valid()); + return !extent->is_pending(); + } + + NodeExtentRef extent; + node_stage_t node_stage; + std::optional mut; + // owned by extent + recorder_t* recorder; +}; + +} diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc index c51ec24740ce..8d88485bf729 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.cc @@ -3,7 +3,7 @@ #include "seastore.h" -#include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_visitor.h" +#include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_accessor.h" #include "crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.h" namespace { diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_visitor.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_visitor.h deleted file mode 100644 index e5c883d3ec98..000000000000 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_visitor.h +++ /dev/null @@ -1,216 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#pragma once - -#include "node_extent_manager.h" -#include "node_delta_recorder.h" -#include "node_layout_replayable.h" - -namespace crimson::os::seastore::onode { - -template -class DeltaRecorderT final: public DeltaRecorder { - public: - using layout_t = NodeLayoutReplayableT; - using position_t = typename layout_t::position_t; - using StagedIterator = typename layout_t::StagedIterator; - using value_t = typename layout_t::value_t; - static constexpr auto FIELD_TYPE = layout_t::FIELD_TYPE; - - ~DeltaRecorderT() override = default; - - template - void encode_insert( - const full_key_t& key, - const value_t& value, - const position_t& insert_pos, - const match_stage_t& insert_stage, - const node_offset_t& insert_size) { - // TODO encode to encoded - } - - void encode_split( - const StagedIterator& split_at, - const char* p_start) { - // TODO encode to encoded - } - - template - void encode_split_insert( - const StagedIterator& split_at, - const full_key_t& key, - const value_t& value, - const position_t& insert_pos, - const match_stage_t& insert_stage, - const node_offset_t& insert_size, - const char* p_start) { - // TODO encode to encoded - } - - void encode_update_child_addr( - const laddr_t new_addr, - const laddr_packed_t* p_addr, - const char* p_start) { - // TODO encode to encoded - } - - static DeltaRecorderURef create() { - return std::unique_ptr(new DeltaRecorderT()); - } - - private: - DeltaRecorderT() = default; - 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 { - assert(is_empty()); - // TODO decode and apply - assert(false && "not implemented"); - } -}; - -template -class NodeExtentT { - public: - using layout_t = NodeLayoutReplayableT; - using node_stage_t = typename layout_t::node_stage_t; - using position_t = typename layout_t::position_t; - using recorder_t = DeltaRecorderT; - using StagedIterator = typename layout_t::StagedIterator; - using value_t = typename layout_t::value_t; - static constexpr auto FIELD_TYPE = layout_t::FIELD_TYPE; - - NodeExtentT(NodeExtentRef extent) - : extent{extent}, - node_stage{reinterpret_cast(extent->get_read())} { - if (no_recording()) { - mut.emplace(extent->get_mutable()); - assert(extent->get_recorder() == nullptr); - recorder = nullptr; - } else if (needs_recording()) { - mut.emplace(extent->get_mutable()); - auto p_recorder = extent->get_recorder(); - assert(p_recorder != nullptr); - assert(p_recorder->node_type() == NODE_TYPE); - assert(p_recorder->field_type() == FIELD_TYPE); - recorder = static_cast(p_recorder); - } else if (needs_mutate()) { - // mut is empty - assert(extent->get_recorder() == nullptr || - extent->get_recorder()->is_empty()); - recorder = nullptr; - } else { - ceph_abort("impossible path"); - } - } - ~NodeExtentT() = default; - NodeExtentT(const NodeExtentT&) = delete; - NodeExtentT(NodeExtentT&&) = delete; - NodeExtentT& operator=(const NodeExtentT&) = delete; - NodeExtentT& operator=(NodeExtentT&&) = delete; - - const node_stage_t& read() const { return node_stage; } - laddr_t get_laddr() const { return extent->get_laddr(); } - - // must be called before any mutate attempes. - // for the safety of mixed read and mutate, call before read. - void prepare_mutate(context_t c) { - if (needs_mutate()) { - auto ref_recorder = recorder_t::create(); - recorder = static_cast(ref_recorder.get()); - extent = extent->mutate(c, std::move(ref_recorder)); - assert(needs_recording()); - node_stage = node_stage_t( - reinterpret_cast(extent->get_read())); - assert(recorder == static_cast(extent->get_recorder())); - mut.emplace(extent->get_mutable()); - } - } - - template - const value_t* insert_replayable( - const full_key_t& key, - const value_t& value, - position_t& insert_pos, - match_stage_t& insert_stage, - node_offset_t& insert_size) { - assert(!needs_mutate()); - if (needs_recording()) { - recorder->template encode_insert( - key, value, insert_pos, insert_stage, insert_size); - } - return layout_t::template insert( - *mut, read(), key, value, - insert_pos, insert_stage, insert_size); - } - - void split_replayable(StagedIterator& split_at) { - assert(!needs_mutate()); - if (needs_recording()) { - recorder->encode_split(split_at, read().p_start()); - } - layout_t::split(*mut, read(), split_at); - } - - template - const value_t* split_insert_replayable( - StagedIterator& split_at, - const full_key_t& key, - const value_t& value, - position_t& insert_pos, - match_stage_t& insert_stage, - node_offset_t& insert_size) { - assert(!needs_mutate()); - if (needs_recording()) { - recorder->template encode_split_insert( - split_at, key, value, insert_pos, insert_stage, insert_size, - read().p_start()); - } - return layout_t::template split_insert( - *mut, read(), split_at, key, value, - insert_pos, insert_stage, insert_size); - } - - void update_child_addr_replayable( - const laddr_t new_addr, laddr_packed_t* p_addr) { - assert(!needs_mutate()); - if (needs_recording()) { - recorder->encode_update_child_addr(new_addr, p_addr, read().p_start()); - } - return layout_t::update_child_addr(*mut, new_addr, p_addr); - } - - void test_copy_to(NodeExtentMutable& to) const { - assert(extent->get_length() == to.get_length()); - std::memcpy(to.get_write(), extent->get_read(), extent->get_length()); - } - - private: - /** - * Possible states with CachedExtent::extent_state_t: - * INITIAL_WRITE_PENDING -- can mutate, no recording - * MUTATION_PENDING -- can mutate, needs recording - * CLEAN/DIRTY -- pending mutate - * INVALID -- impossible - */ - bool no_recording() const { - return extent->is_initial_pending(); - } - bool needs_recording() const { - return extent->is_mutation_pending(); - } - bool needs_mutate() const { - assert(extent->is_valid()); - return !extent->is_pending(); - } - - NodeExtentRef extent; - node_stage_t node_stage; - std::optional mut; - // owned by extent - recorder_t* recorder; -}; - -} 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 4df7d3720c99..24a502256196 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 @@ -8,7 +8,7 @@ #include "common/likely.h" #include "crimson/common/log.h" -#include "node_extent_visitor.h" +#include "node_extent_accessor.h" #include "node_impl.h" #include "stages/node_stage_layout.h" @@ -36,7 +36,7 @@ template class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { public: using URef = std::unique_ptr; - using extent_t = NodeExtentT; + using extent_t = NodeExtentAccessorT; using parent_t = typename node_impl_type::type; using marker_t = typename node_marker_type::type; using node_stage_t = typename extent_t::node_stage_t;