From 630babc1b24f887e93c32ab1d9c29494adc9679c Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Sun, 11 Apr 2021 23:49:33 +0800 Subject: [PATCH] crimson/onode-staged-tree: implement fast Node::get_name() Signed-off-by: Yingxin Cheng --- .../onode_manager/staged-fltree/node.cc | 5 +++ .../onode_manager/staged-fltree/node.h | 3 ++ .../onode_manager/staged-fltree/node_impl.h | 1 + .../onode_manager/staged-fltree/node_layout.h | 36 +++++++++++++------ .../seastore/onode_tree/test_staged_fltree.cc | 14 ++++++++ 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc index e55ff710cd392..0a682098bc0f0 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc @@ -370,6 +370,11 @@ std::ostream& Node::dump_brief(std::ostream& os) const return impl->dump_brief(os); } +const std::string& Node::get_name() const +{ + return impl->get_name(); +} + void Node::test_make_destructable( context_t c, NodeExtentMutable& mut, Super::URef&& _super) { diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node.h index fd2271fd1460d..2159ff51395ef 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.h @@ -373,6 +373,9 @@ class Node /// Returns an ostream containing an one-line summary of this node. std::ostream& dump_brief(std::ostream&) const; + /// Print the node name + const std::string& get_name() const; + /// Initializes the tree by allocating an empty root node. static node_future<> mkfs(context_t, RootNodeTracker&); diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h index f0805ac7d1d22..6a74911d2d0b1 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h @@ -91,6 +91,7 @@ class NodeImpl { virtual node_stats_t get_stats() const = 0; virtual std::ostream& dump(std::ostream&) const = 0; virtual std::ostream& dump_brief(std::ostream&) const = 0; + virtual const std::string& get_name() const = 0; virtual void validate_layout() const = 0; virtual void test_copy_to(NodeExtentMutable&) const = 0; 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 2c82a5cffe76a..7ef4b84c465cd 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 @@ -172,18 +172,14 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { } std::ostream& dump_brief(std::ostream& os) const override { - auto& node_stage = extent.read(); - os << "Node" << NODE_TYPE << FIELD_TYPE - << "@0x" << std::hex << extent.get_laddr() - << "+" << node_stage_t::EXTENT_SIZE << std::dec - << (node_stage.is_level_tail() ? "$" : "") - << "(level=" << (unsigned)node_stage.level() - << ", filled=" << filled_size() << "B" - << ", free=" << node_stage.free_size() << "B" - << ")"; + os << name + << "(filled=" << filled_size() << "B" + << ", free=" << extent.read().free_size() << "B)"; return os; } + const std::string& get_name() const override { return name; } + void validate_layout() const override { #ifndef NDEBUG STAGE_T::validate(extent.read()); @@ -196,6 +192,7 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { void test_set_tail(NodeExtentMutable& mut) override { node_stage_t::update_is_level_tail(mut, extent.read(), true); + build_name(); } /* @@ -536,6 +533,10 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { #endif extent.split_replayable(split_at); } + if (right_impl.is_level_tail()) { + // is_level_tail of left is changed by split/split_insert + build_name(); + } if (unlikely(logger().is_enabled(seastar::log_level::debug))) { std::ostringstream sos; dump(sos); @@ -653,7 +654,9 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { } private: - NodeLayoutT(NodeExtentRef extent) : extent{extent} {} + NodeLayoutT(NodeExtentRef extent) : extent{extent} { + build_name(); + } node_offset_t filled_size() const { auto& node_stage = extent.read(); @@ -662,11 +665,24 @@ class NodeLayoutT final : public InternalNodeImpl, public LeafNodeImpl { return ret; } + // rebuild the name whenever addr, type, level, tail is changed + void build_name() { + // XXX: maybe also include the extent state + std::ostringstream sos; + sos << "Node" << NODE_TYPE << FIELD_TYPE + << "@0x" << std::hex << extent.get_laddr() + << "+" << node_stage_t::EXTENT_SIZE << std::dec + << "Lv" << (unsigned)level() + << (is_level_tail() ? "$" : ""); + name = sos.str(); + } + static seastar::logger& logger() { return crimson::get_logger(ceph_subsys_filestore); } extent_t extent; + std::string name = "Node-N/A"; }; using InternalNode0 = NodeLayoutT; diff --git a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc index d2bb0ebd730a5..7f3af8db18844 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -686,6 +686,7 @@ class DummyChildPool { DummyChildImpl(const std::set& keys, bool is_level_tail, laddr_t laddr) : keys{keys}, _is_level_tail{is_level_tail}, _laddr{laddr} { std::tie(key_view, p_mem_key_view) = build_key_view(*keys.crbegin()); + build_name(); } ~DummyChildImpl() override { std::free(p_mem_key_view); @@ -698,12 +699,14 @@ class DummyChildPool { _is_level_tail = level_tail; std::free(p_mem_key_view); std::tie(key_view, p_mem_key_view) = build_key_view(*keys.crbegin()); + build_name(); } public: laddr_t laddr() const override { return _laddr; } bool is_level_tail() const override { return _is_level_tail; } std::optional get_pivot_index() const override { return {key_view}; } + const std::string& get_name() const override { return name; } protected: node_type_t node_type() const override { return node_type_t::LEAF; } @@ -735,9 +738,20 @@ class DummyChildPool { ceph_abort("impossible path"); } private: + void build_name() { + std::ostringstream sos; + sos << "DummyNode" + << "@0x" << std::hex << laddr() << std::dec + << "Lv" << (unsigned)level() + << (is_level_tail() ? "$" : "") + << "(" << key_view << ")"; + name = sos.str(); + } + std::set keys; bool _is_level_tail; laddr_t _laddr; + std::string name; key_view_t key_view; void* p_mem_key_view; -- 2.39.5