]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: count tree size during OSD startup 46640/head
authorXuehan Xu <xxhdx1985126@gmail.com>
Fri, 17 Jun 2022 04:33:28 +0000 (12:33 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Wed, 22 Jun 2022 03:51:50 +0000 (11:51 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/backref/btree_backref_manager.cc
src/crimson/os/seastore/backref_manager.h
src/crimson/os/seastore/btree/fixed_kv_btree.h
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/transaction_manager.cc
src/test/crimson/seastore/test_transaction_manager.cc

index 5371351ef69b2e2e06798d8daaa4abd3aae04a45..9823a218a0e8afbae5d1639a74e0d08b12ec5c51 100644 (file)
@@ -307,7 +307,7 @@ BtreeBackrefManager::scan_mapped_space(
                  interruptible::ready_future_marker{},
                  seastar::stop_iteration::yes);
              }
-             visitor(pos.get_key(), pos.get_val().len, 0);
+             visitor(pos.get_key(), pos.get_val().len, 0, pos.get_val().type);
              return BackrefBtree::iterate_repeat_ret_inner(
                interruptible::ready_future_marker{},
                seastar::stop_iteration::no);
index 6e98f11b4f373c9e3981706c1c45eba5bace487b..8082356d3956f1afffc71a4dffa71ad31a83ab22 100644 (file)
@@ -151,7 +151,7 @@ public:
     SegmentManager::read_ertr>;
   using scan_mapped_space_ret = scan_mapped_space_iertr::future<>;
   using scan_mapped_space_func_t = std::function<
-    void(paddr_t, extent_len_t, depth_t)>;
+    void(paddr_t, extent_len_t, depth_t, extent_types_t)>;
   virtual scan_mapped_space_ret scan_mapped_space(
     Transaction &t,
     scan_mapped_space_func_t &&f) = 0;
index db185bcbe29db84e8355b9e6c73947ef5240bebf..a448fb0c2c9c67a441cc09ff522d312eac330a4d 100644 (file)
@@ -58,7 +58,7 @@ public:
   using iterator_fut = base_iertr::future<iterator>;
 
   using mapped_space_visitor_t = std::function<
-    void(paddr_t, extent_len_t, depth_t)>;
+    void(paddr_t, extent_len_t, depth_t, extent_types_t)>;
 
   class iterator {
   public:
@@ -1119,7 +1119,8 @@ private:
        if (visitor) (*visitor)(
           root_node->get_paddr(),
           root_node->get_length(),
-          root.get_depth());
+          root.get_depth(),
+          internal_node_t::TYPE);
        return lookup_root_iertr::now();
       });
     } else {
@@ -1133,7 +1134,8 @@ private:
        if (visitor) (*visitor)(
           root_node->get_paddr(),
           root_node->get_length(),
-          root.get_depth());
+          root.get_depth(),
+          leaf_node_t::TYPE);
        return lookup_root_iertr::now();
       });
     }
@@ -1170,7 +1172,12 @@ private:
       auto node_iter = f(*node);
       assert(node_iter != node->end());
       entry.pos = node_iter->get_offset();
-      if (visitor) (*visitor)(node->get_paddr(), node->get_length(), depth);
+      if (visitor)
+        (*visitor)(
+          node->get_paddr(),
+          node->get_length(),
+          depth,
+          node->get_type());
       return seastar::now();
     });
   }
@@ -1203,7 +1210,12 @@ private:
       iter.leaf.node = node;
       auto node_iter = f(*node);
       iter.leaf.pos = node_iter->get_offset();
-      if (visitor) (*visitor)(node->get_paddr(), node->get_length(), 1);
+      if (visitor)
+        (*visitor)(
+          node->get_paddr(),
+          node->get_length(),
+          1,
+          node->get_type());
       return seastar::now();
     });
   }
index 582607a9f1200728ed9c95669fee858465de8d85..043f091393a81f381d3e3a64031f4438d03f4f51 100644 (file)
@@ -975,6 +975,34 @@ public:
     };
   };
 
+  void update_tree_extents_num(extent_types_t type, int64_t delta) {
+    switch (type) {
+    case extent_types_t::LADDR_INTERNAL:
+      [[fallthrough]];
+    case extent_types_t::LADDR_LEAF:
+      stats.lba_tree_extents_num += delta;
+      ceph_assert(stats.lba_tree_extents_num >= 0);
+      return;
+    case extent_types_t::OMAP_INNER:
+      [[fallthrough]];
+    case extent_types_t::OMAP_LEAF:
+      stats.omap_tree_extents_num += delta;
+      ceph_assert(stats.lba_tree_extents_num >= 0);
+      return;
+    case extent_types_t::ONODE_BLOCK_STAGED:
+      stats.onode_tree_extents_num += delta;
+      ceph_assert(stats.onode_tree_extents_num >= 0);
+      return;
+    case extent_types_t::BACKREF_INTERNAL:
+      [[fallthrough]];
+    case extent_types_t::BACKREF_LEAF:
+      stats.backref_tree_extents_num += delta;
+      ceph_assert(stats.backref_tree_extents_num >= 0);
+      return;
+    default:
+      return;
+    }
+  }
 private:
   ExtentPlacementManager& epm;
   RootBlockRef root;               ///< ref to current root
index 2f9bfe23e33f38365ea41bad256d09a200ad57d7..8b7719c90b21ddf917e734d11bd1714f83aa44db 100644 (file)
@@ -128,7 +128,12 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
                       *segment_cleaner->get_empty_space_tracker()));
              return backref_manager->scan_mapped_space(
                t,
-               [this, FNAME, &t](paddr_t addr, extent_len_t len, depth_t depth) {
+               [this, FNAME, &t](
+                 paddr_t addr,
+                 extent_len_t len,
+                 depth_t depth,
+                 extent_types_t type)
+               {
                  TRACET(
                    "marking {}~{} used",
                    t,
@@ -143,14 +148,15 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
                      seastar::lowres_system_clock::time_point(),
                      /* init_scan = */ true);
                  }
-                 if (depth) {
-                   if (depth > 1) {
-                     backref_manager->cache_new_backref_extent(
-                       addr, extent_types_t::BACKREF_INTERNAL);
-                   } else {
-                     backref_manager->cache_new_backref_extent(
-                       addr, extent_types_t::BACKREF_LEAF);
-                   }
+                 if (is_backref_node(type)) {
+                   ceph_assert(depth);
+                   backref_manager->cache_new_backref_extent(addr, type);
+                   cache->update_tree_extents_num(type, 1);
+                   return seastar::now();
+                 } else {
+                   ceph_assert(!depth);
+                   cache->update_tree_extents_num(type, 1);
+                   return seastar::now();
                  }
                }).si_then([this] {
                  LOG_PREFIX(TransactionManager::mount);
@@ -163,6 +169,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount()
                      seastar::lowres_system_clock::time_point(),
                      seastar::lowres_system_clock::time_point(),
                      true);
+                   cache->update_tree_extents_num(backref.type, 1);
                  }
                  return seastar::now();
                });
index d650fff95ddd9987374d6f8366401208d2ba8869..f5c564fa4b0db5e4cc4e70b3f505206177cba774 100644 (file)
@@ -402,7 +402,7 @@ struct transaction_manager_test_t :
       [this, &tracker](auto &t) {
        return backref_manager->scan_mapped_space(
          t,
-         [&tracker, this](auto offset, auto len, depth_t) {
+         [&tracker, this](auto offset, auto len, depth_t, extent_types_t) {
            if (offset.get_addr_type() == addr_types_t::SEGMENT &&
                !backref_manager->backref_should_be_removed(offset)) {
              logger().debug("check_usage: tracker alloc {}~{}",