From: Xuehan Xu Date: Fri, 17 Jun 2022 04:33:28 +0000 (+0800) Subject: crimson/os/seastore/cache: count tree size during OSD startup X-Git-Tag: v18.0.0~639^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=78d018958c54cd700f34023913a482debaa494e3;p=ceph.git crimson/os/seastore/cache: count tree size during OSD startup Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/backref/btree_backref_manager.cc b/src/crimson/os/seastore/backref/btree_backref_manager.cc index 5371351ef69b2..9823a218a0e8a 100644 --- a/src/crimson/os/seastore/backref/btree_backref_manager.cc +++ b/src/crimson/os/seastore/backref/btree_backref_manager.cc @@ -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); diff --git a/src/crimson/os/seastore/backref_manager.h b/src/crimson/os/seastore/backref_manager.h index 6e98f11b4f373..8082356d3956f 100644 --- a/src/crimson/os/seastore/backref_manager.h +++ b/src/crimson/os/seastore/backref_manager.h @@ -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; diff --git a/src/crimson/os/seastore/btree/fixed_kv_btree.h b/src/crimson/os/seastore/btree/fixed_kv_btree.h index db185bcbe29db..a448fb0c2c9c6 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_btree.h +++ b/src/crimson/os/seastore/btree/fixed_kv_btree.h @@ -58,7 +58,7 @@ public: using iterator_fut = base_iertr::future; 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(); }); } diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 582607a9f1200..043f091393a81 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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 diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 2f9bfe23e33f3..8b7719c90b21d 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -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(); }); diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index d650fff95ddd9..f5c564fa4b0db 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -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 {}~{}",