From: Yingxin Cheng Date: Fri, 23 Apr 2021 03:00:34 +0000 (+0800) Subject: crimson/onode-staged-tree: implement delta encode/decode for erase ops X-Git-Tag: v17.1.0~2110^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=36b4610a2cc9669c059390d7c4366282b7759336;p=ceph.git crimson/onode-staged-tree: implement delta encode/decode for erase ops 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 a3aa92c74490..01a931e91439 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 @@ -84,6 +84,16 @@ class DeltaRecorderT final: public DeltaRecorder { ceph::encode(static_cast(node_offset), encoded); } + void encode_erase( + const position_t& erase_pos) { + ceph::encode(node_delta_op_t::ERASE, encoded); + erase_pos.encode(encoded); + } + + void encode_make_tail() { + ceph::encode(node_delta_op_t::MAKE_TAIL, encoded); + } + static DeltaRecorderURef create_for_encode(const ValueBuilder& v_builder) { return std::unique_ptr(new DeltaRecorderT(v_builder)); } @@ -159,6 +169,19 @@ class DeltaRecorderT final: public DeltaRecorder { layout_t::update_child_addr(node, new_addr, p_addr); break; } + case node_delta_op_t::ERASE: { + logger().debug("OTree::Extent::Replay: decoding ERASE ..."); + auto erase_pos = position_t::decode(delta); + logger().debug("OTree::Extent::Replay: apply erase_pos({}) ...", + erase_pos); + layout_t::erase(node, stage, erase_pos); + break; + } + case node_delta_op_t::MAKE_TAIL: { + logger().debug("OTree::Extent::Replay: decoded MAKE_TAIL, apply ..."); + layout_t::make_tail(node, stage); + break; + } case node_delta_op_t::SUBOP_UPDATE_VALUE: { logger().debug("OTree::Extent::Replay: decoding SUBOP_UPDATE_VALUE ..."); node_offset_t value_header_offset; @@ -415,6 +438,40 @@ class NodeExtentAccessorT { #endif } + std::tuple erase_replayable(const position_t& pos) { + assert(extent->is_pending()); + assert(state != nextent_state_t::READ_ONLY); + if (state == nextent_state_t::MUTATION_PENDING) { + recorder->encode_erase(pos); + } +#ifndef NDEBUG + test_extent->prepare_replay(extent); + test_recorder->encode_erase(pos); +#endif + auto ret = layout_t::erase(*mut, read(), pos); +#ifndef NDEBUG + test_extent->replay_and_verify(extent); +#endif + return ret; + } + + position_t make_tail_replayable() { + assert(extent->is_pending()); + assert(state != nextent_state_t::READ_ONLY); + if (state == nextent_state_t::MUTATION_PENDING) { + recorder->encode_make_tail(); + } +#ifndef NDEBUG + test_extent->prepare_replay(extent); + test_recorder->encode_make_tail(); +#endif + auto ret = layout_t::make_tail(*mut, read()); +#ifndef NDEBUG + test_extent->replay_and_verify(extent); +#endif + return ret; + } + std::pair prepare_mutate_value_payload(context_t c) { prepare_mutate(c); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout_replayable.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout_replayable.h index 23497219a154..795c1cce23da 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout_replayable.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_layout_replayable.h @@ -71,6 +71,22 @@ struct NodeLayoutReplayableT { assert(NODE_TYPE == node_type_t::INTERNAL); mut.copy_in_absolute(p_addr, new_addr); } + + static std::tuple erase( + NodeExtentMutable& mut, + const node_stage_t& node_stage, + const position_t& _erase_pos) { + // TODO + ceph_abort("not implemented"); + } + + static position_t make_tail( + NodeExtentMutable& mut, + const node_stage_t& node_stage) { + assert(!node_stage.is_level_tail()); + // TODO + ceph_abort("not implemented"); + } }; } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h index 0877920f244f..c5ee76b71bca 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h @@ -66,6 +66,8 @@ enum class node_delta_op_t : uint8_t { SPLIT, SPLIT_INSERT, UPDATE_CHILD_ADDR, + ERASE, + MAKE_TAIL, SUBOP_UPDATE_VALUE = 0xff, };