From 6673bf88a48995df989c8135496f7f8351c298f4 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 18 Jun 2021 16:47:05 +0800 Subject: [PATCH] crimson/onode-staged-tree: print NodeExtent with the header Signed-off-by: Yingxin Cheng --- .../staged-fltree/node_delta_recorder.h | 2 +- .../staged-fltree/node_extent_accessor.h | 44 +++++++++---------- .../staged-fltree/node_extent_manager.h | 4 ++ .../staged-fltree/node_extent_manager/dummy.h | 10 +++-- .../node_extent_manager/seastore.cc | 9 ++-- .../node_extent_manager/test_replay.h | 2 +- .../staged-fltree/stages/node_stage_layout.h | 11 +++++ 7 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h index a37fdb6d509..27df8e23a19 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h @@ -42,7 +42,7 @@ class DeltaRecorder { virtual field_type_t field_type() const = 0; virtual void apply_delta(ceph::bufferlist::const_iterator&, NodeExtentMutable&, - laddr_t) = 0; + const NodeExtent&) = 0; protected: DeltaRecorder() = default; 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 51d4b9d7e53..ef0c7292b28 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 @@ -110,12 +110,12 @@ 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, - laddr_t node_laddr) override { + NodeExtentMutable& mut, + const NodeExtent& node) override { LOG_PREFIX(OTree::Extent::Replay); assert(is_empty()); - node_stage_t stage(reinterpret_cast(node.get_read()), - node.get_length()); + node_stage_t stage(reinterpret_cast(mut.get_read()), + mut.get_length()); node_delta_op_t op; try { ceph::decode(op, delta); @@ -133,21 +133,21 @@ class DeltaRecorderT final: public DeltaRecorder { "insert_size={}B ...", key, value, insert_pos, insert_stage, insert_size); layout_t::template insert( - node, stage, key, value, insert_pos, insert_stage, insert_size); + mut, stage, key, value, insert_pos, insert_stage, insert_size); break; } case node_delta_op_t::SPLIT: { DEBUG("decoding SPLIT ..."); auto split_at = StagedIterator::decode( - node.get_read(), node.get_length(), delta); + mut.get_read(), mut.get_length(), delta); DEBUG("apply split_at={} ...", split_at); - layout_t::split(node, stage, split_at); + layout_t::split(mut, stage, split_at); break; } case node_delta_op_t::SPLIT_INSERT: { DEBUG("decoding SPLIT_INSERT ..."); auto split_at = StagedIterator::decode( - node.get_read(), node.get_length(), delta); + mut.get_read(), mut.get_length(), delta); auto key = key_hobj_t::decode(delta); auto value = decode_value(delta); auto insert_pos = position_t::decode(delta); @@ -159,7 +159,7 @@ class DeltaRecorderT final: public DeltaRecorder { "insert_size={}B ...", split_at, key, value, insert_pos, insert_stage, insert_size); layout_t::template split_insert( - node, stage, split_at, key, value, insert_pos, insert_stage, insert_size); + mut, stage, split_at, key, value, insert_pos, insert_stage, insert_size); break; } case node_delta_op_t::UPDATE_CHILD_ADDR: { @@ -169,46 +169,46 @@ class DeltaRecorderT final: public DeltaRecorder { node_offset_t update_offset; ceph::decode(update_offset, delta); auto p_addr = reinterpret_cast( - node.get_write() + update_offset); + mut.get_write() + update_offset); DEBUG("apply {:#x} to offset {:#x} ...", new_addr, update_offset); - layout_t::update_child_addr(node, new_addr, p_addr); + layout_t::update_child_addr(mut, new_addr, p_addr); break; } case node_delta_op_t::ERASE: { DEBUG("decoding ERASE ..."); auto erase_pos = position_t::decode(delta); DEBUG("apply erase_pos({}) ...", erase_pos); - layout_t::erase(node, stage, erase_pos); + layout_t::erase(mut, stage, erase_pos); break; } case node_delta_op_t::MAKE_TAIL: { DEBUG("decoded MAKE_TAIL, apply ..."); - layout_t::make_tail(node, stage); + layout_t::make_tail(mut, stage); break; } case node_delta_op_t::SUBOP_UPDATE_VALUE: { DEBUG("decoding SUBOP_UPDATE_VALUE ..."); node_offset_t value_header_offset; ceph::decode(value_header_offset, delta); - auto p_header = node.get_read() + value_header_offset; + auto p_header = mut.get_read() + value_header_offset; auto p_header_ = reinterpret_cast(p_header); DEBUG("update {} at {:#x} ...", *p_header_, value_header_offset); - auto payload_mut = p_header_->get_payload_mutable(node); - auto value_addr = node_laddr + payload_mut.get_node_offset(); + auto payload_mut = p_header_->get_payload_mutable(mut); + auto value_addr = node.get_laddr() + payload_mut.get_node_offset(); get_value_replayer(p_header_->magic)->apply_value_delta( delta, payload_mut, value_addr); break; } default: - ERROR("got unknown op {} when replay {:#x}", - op, node_laddr); - ceph_abort(); + ERROR("got unknown op {} when replay {}", + op, node); + ceph_abort("fatal error"); } } catch (buffer::error& e) { - ERROR("got decode error {} when replay {:#x}", - e, node_laddr); - ceph_abort(); + ERROR("got decode error {} when replay {}", + e, node); + ceph_abort("fatal error"); } } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h index 924d6ee8770..93c6cbe93a4 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h @@ -47,6 +47,10 @@ class NodeExtent : public LogicalCachedExtent { return NodeExtentMutable(get_bptr().c_str(), get_length()); } + std::ostream& print_detail_l(std::ostream& out) const final { + return out << ", fltree_header=" << get_header(); + } + /** * Abstracted interfaces to implement: * - CacheExtent::duplicate_for_write() -> CachedExtentRef diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h index 1f385cf12d4..0f9f9bbd2fe 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/dummy.h @@ -103,8 +103,8 @@ class DummyNodeExtentManager final: public NodeExtentManager { retire_ertr::future<> retire_extent( Transaction& t, NodeExtentRef extent) override { - TRACET("retiring {}B at {:#x} ...", - t, extent->get_length(), extent->get_laddr()); + TRACET("retiring {}B at {:#x} -- {} ...", + t, extent->get_length(), extent->get_laddr(), *extent); if constexpr (SYNC) { return retire_extent_sync(t, extent); } else { @@ -138,7 +138,8 @@ class DummyNodeExtentManager final: public NodeExtentManager { auto iter = allocate_map.find(addr); assert(iter != allocate_map.end()); auto extent = iter->second; - TRACET("read {}B at {:#x}", t, extent->get_length(), extent->get_laddr()); + TRACET("read {}B at {:#x} -- {}", + t, extent->get_length(), extent->get_laddr(), *extent); assert(extent->get_laddr() == addr); return read_ertr::make_ready_future(extent); } @@ -153,7 +154,8 @@ class DummyNodeExtentManager final: public NodeExtentManager { extent->set_laddr(addr); assert(allocate_map.find(extent->get_laddr()) == allocate_map.end()); allocate_map.insert({extent->get_laddr(), extent}); - DEBUGT("allocated {}B at {:#x}", t, extent->get_length(), extent->get_laddr()); + DEBUGT("allocated {}B at {:#x} -- {}", + t, extent->get_length(), extent->get_laddr(), *extent); assert(extent->get_length() == len); return alloc_ertr::make_ready_future(extent); } 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 ba6eb63d7cf..208c9174b4d 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 @@ -47,7 +47,7 @@ static DeltaRecorderURef create_replay_recorder( NodeExtentRef SeastoreNodeExtent::mutate( context_t c, DeltaRecorderURef&& _recorder) { - DEBUGT("mutate {:#x} ...", c.t, get_laddr()); + DEBUGT("mutate {} ...", c.t, *this); auto p_handle = static_cast(&c.nm); auto extent = p_handle->tm.get_mutable_extent(c.t, this); auto ret = extent->cast(); @@ -60,7 +60,7 @@ NodeExtentRef SeastoreNodeExtent::mutate( void SeastoreNodeExtent::apply_delta(const ceph::bufferlist& bl) { - DEBUG("replay {:#x} ...", get_laddr()); + DEBUG("replay {} ...", *this); if (!recorder) { auto header = get_header(); auto field_type = header.get_field_type(); @@ -77,11 +77,12 @@ void SeastoreNodeExtent::apply_delta(const ceph::bufferlist& bl) assert(recorder->field_type() == *header.get_field_type()); #endif } - auto node = do_get_mutable(); + auto mut = do_get_mutable(); auto p = bl.cbegin(); while (p != bl.end()) { - recorder->apply_delta(p, node, get_laddr()); + recorder->apply_delta(p, mut, *this); } + DEBUG("relay done!"); } } diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h index 7f46ac96f01..b63a362f845 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h @@ -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, 0u); + recorder->apply_delta(p, mut, *this); 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/stages/node_stage_layout.h b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.h index f69b902dc33..611b7dc1828 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/stages/node_stage_layout.h @@ -56,6 +56,17 @@ struct node_header_t { is_level_tail = static_cast(value); } } __attribute__((packed)); +inline std::ostream& operator<<(std::ostream& os, const node_header_t& header) { + auto field_type = header.get_field_type(); + if (field_type.has_value()) { + os << "header" << header.get_node_type() << *field_type + << "(is_level_tail=" << header.get_is_level_tail() + << ", level=" << (unsigned)header.level << ")"; + } else { + os << "header(INVALID)"; + } + return os; +} template struct _slot_t { -- 2.39.5