return LBABtree::iterate_repeat(
c,
btree.upper_bound_right(c, offset),
+ false,
[&ret, offset, length](auto &pos) {
if (pos.is_end() || pos.get_key() >= (offset + length)) {
return LBABtree::iterate_repeat_ret_inner(
LOG_PREFIX(BtreeLBAManager::alloc_extent);
DEBUGT("hint: {}, length: {}", t, hint, len);
auto c = get_context(t);
+ ++LBABtree::lba_tree_inner_stats.num_alloc_extents;
return with_btree_state<state_t>(
c,
hint,
return LBABtree::iterate_repeat(
c,
btree.upper_bound_right(c, hint),
+ true,
[&state, len](auto &pos) {
if (pos.is_end() || pos.get_key() >= (state.last_end + len)) {
state.insert_iter = pos;
return LBABtree::iterate_repeat(
c,
btree.upper_bound_right(c, begin),
+ false,
[f=std::move(f), begin, end](auto &pos) {
if (pos.is_end() || pos.get_key() >= end) {
return LBABtree::iterate_repeat_ret_inner(
return LBABtree::iterate_repeat(
c,
btree.lower_bound(c, 0, &visitor),
+ false,
[&visitor](auto &pos) {
if (pos.is_end()) {
return LBABtree::iterate_repeat_ret_inner(
SegmentManager &segment_manager,
Cache &cache)
: segment_manager(segment_manager),
- cache(cache) {}
+ cache(cache)
+{
+ register_metrics();
+}
+
+LBABtree::lba_tree_inner_stats_t LBABtree::lba_tree_inner_stats;
+void BtreeLBAManager::register_metrics()
+{
+ namespace sm = seastar::metrics;
+ metrics.add_group(
+ "LBA",
+ {
+ sm::make_counter(
+ "alloc_extents",
+ LBABtree::lba_tree_inner_stats.num_alloc_extents,
+ sm::description("total number of lba alloc_extent operations")
+ ),
+ sm::make_counter(
+ "alloc_extents_iter_nexts",
+ LBABtree::lba_tree_inner_stats.num_alloc_extents_iter_nexts,
+ sm::description("total number of iterator next operations during extent allocation")
+ ),
+ }
+ );
+}
BtreeLBAManager::update_refcount_ret BtreeLBAManager::update_refcount(
Transaction &t,
using mapped_space_visitor_t = LBAManager::scan_mapped_space_func_t;
+ struct lba_tree_inner_stats_t {
+ uint64_t num_alloc_extents = 0;
+ uint64_t num_alloc_extents_iter_nexts = 0;
+ } static lba_tree_inner_stats;
+
class iterator {
public:
iterator(const iterator &rhs) noexcept :
static base_iertr::future<> iterate_repeat(
op_context_t c,
iterator_fut &&iter_fut,
+ bool need_count,
F &&f,
mapped_space_visitor_t *visitor=nullptr) {
return std::move(
iter_fut
- ).si_then([c, visitor, f=std::forward<F>(f)](auto iter) {
+ ).si_then([c, need_count, visitor, f=std::forward<F>(f)](auto iter) {
return seastar::do_with(
iter,
std::move(f),
- [c, visitor](auto &pos, auto &f) {
+ [c, need_count, visitor](auto &pos, auto &f) {
return trans_intr::repeat(
- [c, visitor, &f, &pos] {
+ [c, need_count, visitor, &f, &pos] {
return f(
pos
- ).si_then([c, visitor, &pos](auto done) {
+ ).si_then([c, need_count, visitor, &pos](auto done) {
if (done == seastar::stop_iteration::yes) {
return iterate_repeat_ret_inner(
interruptible::ready_future_marker{},
seastar::stop_iteration::yes);
} else {
ceph_assert(!pos.is_end());
+ if (need_count) {
+ ++LBABtree::lba_tree_inner_stats.num_alloc_extents_iter_nexts;
+ }
return pos.next(
c, visitor
).si_then([&pos](auto next) {