]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/onode-staged-tree: implement fast Node::get_name()
authorYingxin Cheng <yingxin.cheng@intel.com>
Sun, 11 Apr 2021 15:49:33 +0000 (23:49 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Thu, 29 Apr 2021 08:03:37 +0000 (16:03 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node.cc
src/crimson/os/seastore/onode_manager/staged-fltree/node.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_impl.h
src/crimson/os/seastore/onode_manager/staged-fltree/node_layout.h
src/test/crimson/seastore/onode_tree/test_staged_fltree.cc

index e55ff710cd392740054487a7b2831ec6ec87c631..0a682098bc0f0dc36aafdf89c8f391c60c9ec281 100644 (file)
@@ -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)
 {
index fd2271fd1460dddf42f06fcd22ace839d9cb39c2..2159ff51395efe8490c8a87547267d0e738f092a 100644 (file)
@@ -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&);
 
index f0805ac7d1d2281803e238e3b080c88259811d99..6a74911d2d0b189c10bc9e4aaf18fe9807fb8c02 100644 (file)
@@ -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;
index 2c82a5cffe76a32d1a8d40091c53d89bd7f7c1e7..7ef4b84c465cd430b31eadae4ac776a8a745b451 100644 (file)
@@ -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<node_fields_0_t, node_type_t::INTERNAL>;
index d2bb0ebd730a5b7448d32b921731cf1886dbc166..7f3af8db1884438f72d27831c3e9189dcaa37dbd 100644 (file)
@@ -686,6 +686,7 @@ class DummyChildPool {
     DummyChildImpl(const std::set<ghobject_t>& 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<key_view_t> 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<ghobject_t> keys;
     bool _is_level_tail;
     laddr_t _laddr;
+    std::string name;
 
     key_view_t key_view;
     void* p_mem_key_view;