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);
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;
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:
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 {
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();
});
}
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();
});
}
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();
});
}
};
};
+ 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
*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,
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);
seastar::lowres_system_clock::time_point(),
seastar::lowres_system_clock::time_point(),
true);
+ cache->update_tree_extents_num(backref.type, 1);
}
return seastar::now();
});
[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 {}~{}",