#include "crimson/os/seastore/logging.h"
SET_SUBSYS(seastore_lba);
+/*
+ * levels:
+ * - INFO: mkfs
+ * - DEBUG: modification operations
+ * - TRACE: read operations, DEBUG details
+ */
namespace crimson::os::seastore::lba_manager::btree {
BtreeLBAManager::mkfs_ret BtreeLBAManager::mkfs(
Transaction &t)
{
+ LOG_PREFIX(BtreeLBAManager::mkfs);
+ INFOT("start", t);
return cache.get_root(t).si_then([this, &t](auto croot) {
croot->get_root().lba_root = LBABtree::mkfs(get_context(t));
return mkfs_iertr::now();
laddr_t offset, extent_len_t length)
{
LOG_PREFIX(BtreeLBAManager::get_mappings);
- DEBUGT("offset: {}, length{}", t, offset, length);
+ TRACET("{}~{}", t, offset, length);
auto c = get_context(t);
return with_btree_state<lba_pin_list_t>(
c,
- [c, offset, length](auto &btree, auto &ret) {
+ [c, offset, length, FNAME](auto &btree, auto &ret) {
return LBABtree::iterate_repeat(
c,
btree.upper_bound_right(c, offset),
- [&ret, offset, length](auto &pos) {
+ [&ret, offset, length, c, FNAME](auto &pos) {
if (pos.is_end() || pos.get_key() >= (offset + length)) {
+ TRACET("{}~{} done with {} results",
+ c.trans, offset, length, ret.size());
return LBABtree::iterate_repeat_ret_inner(
interruptible::ready_future_marker{},
seastar::stop_iteration::yes);
}
+ TRACET("{}~{} got {}, {}, repeat ...",
+ c.trans, offset, length, pos.get_key(), pos.get_val());
ceph_assert((pos.get_key() + pos.get_val().len) > offset);
ret.push_back(pos.get_pin());
return LBABtree::iterate_repeat_ret_inner(
laddr_list_t &&list)
{
LOG_PREFIX(BtreeLBAManager::get_mappings);
- DEBUGT("{}", t, list);
+ TRACET("{}", t, list);
auto l = std::make_unique<laddr_list_t>(std::move(list));
auto retptr = std::make_unique<lba_pin_list_t>();
auto &ret = *retptr;
laddr_t offset)
{
LOG_PREFIX(BtreeLBAManager::get_mapping);
- DEBUGT("{}", t, offset);
+ TRACET("{}", t, offset);
auto c = get_context(t);
return with_btree_ret<LBAPinRef>(
c,
c, offset
).si_then([FNAME, offset, c](auto iter) -> get_mapping_ret {
if (iter.is_end() || iter.get_key() != offset) {
+ DEBUGT("{} doesn't exist", c.trans, offset);
return crimson::ct_error::enoent::make();
} else {
+ TRACET("{} got {}, {}",
+ c.trans, offset, iter.get_key(), iter.get_val());
auto e = iter.get_pin();
- DEBUGT("got mapping {}", c.trans, *e);
return get_mapping_ret(
interruptible::ready_future_marker{},
std::move(e));
};
LOG_PREFIX(BtreeLBAManager::alloc_extent);
- DEBUGT("hint: {}, length: {}", t, hint, len);
+ TRACET("{}~{}, hint={}", t, addr, len, hint);
auto c = get_context(t);
++stats.num_alloc_extents;
+ auto lookup_attempts = stats.num_alloc_extents_iter_nexts;
return with_btree_state<state_t>(
c,
hint,
- [this, FNAME, c, hint, len, addr, &t](auto &btree, auto &state) {
+ [this, FNAME, c, hint, len, addr, lookup_attempts, &t](auto &btree, auto &state) {
return LBABtree::iterate_repeat(
c,
btree.upper_bound_right(c, hint),
- [this, &state, len, &t, hint, FNAME](auto &pos) {
+ [this, &state, len, addr, &t, hint, FNAME, lookup_attempts](auto &pos) {
++stats.num_alloc_extents_iter_nexts;
- if (!pos.is_end()) {
- DEBUGT("iterate_repeat: pos: {}~{}, state: {}~{}, hint: {}",
- t,
- pos.get_key(),
- pos.get_val().len,
+ if (pos.is_end()) {
+ DEBUGT("{}~{}, hint={}, state: end, done with {} attempts, insert at {}",
+ t, addr, len, hint,
+ stats.num_alloc_extents_iter_nexts - lookup_attempts,
+ state.last_end);
+ state.insert_iter = pos;
+ return LBABtree::iterate_repeat_ret_inner(
+ interruptible::ready_future_marker{},
+ seastar::stop_iteration::yes);
+ } else if (pos.get_key() >= (state.last_end + len)) {
+ DEBUGT("{}~{}, hint={}, state: {}~{}, done with {} attempts, insert at {} -- {}",
+ t, addr, len, hint,
+ pos.get_key(), pos.get_val().len,
+ stats.num_alloc_extents_iter_nexts - lookup_attempts,
state.last_end,
- len,
- hint);
- }
- if (pos.is_end() || pos.get_key() >= (state.last_end + len)) {
+ pos.get_val());
state.insert_iter = pos;
return LBABtree::iterate_repeat_ret_inner(
interruptible::ready_future_marker{},
seastar::stop_iteration::yes);
} else {
state.last_end = pos.get_key() + pos.get_val().len;
+ TRACET("{}~{}, hint={}, state: {}~{}, repeat ... -- {}",
+ t, addr, len, hint,
+ pos.get_key(), pos.get_val().len,
+ pos.get_val());
return LBABtree::iterate_repeat_ret_inner(
interruptible::ready_future_marker{},
seastar::stop_iteration::no);
}
- }).si_then([FNAME, c, addr, len, &btree, &state] {
- DEBUGT("about to insert at addr {}~{}", c.trans, state.last_end, len);
+ }).si_then([FNAME, c, addr, len, hint, &btree, &state] {
return btree.insert(
c,
*state.insert_iter,
state.last_end,
lba_map_val_t{len, addr, 1, 0}
- ).si_then([&state](auto &&p) {
+ ).si_then([&state, FNAME, c, addr, len, hint](auto &&p) {
auto [iter, inserted] = std::move(p);
+ TRACET("{}~{}, hint={}, inserted at {}",
+ c.trans, addr, len, hint, state.last_end);
ceph_assert(inserted);
state.ret = iter;
});
Transaction &t)
{
LOG_PREFIX(BtreeLBAManager::complete_transaction);
+ DEBUGT("start", t);
std::vector<CachedExtentRef> to_clear;
to_clear.reserve(t.get_retired_set().size());
for (auto &e: t.get_retired_set()) {
for (auto &e: to_clear) {
auto &pin = get_pin(*e);
- DEBUGT("retiring {}, {}", t, *e, pin);
+ DEBUGT("retiring extent {} -- {}", t, pin, *e);
pin_set.retire(pin);
}
[](auto &l, auto &r) -> bool { return get_depth(*l) > get_depth(*r); });
for (auto &e : to_link) {
- DEBUGT("linking {}", t, *e);
+ DEBUGT("linking extent -- {}", t, *e);
pin_set.add_pin(get_pin(*e));
}
for (auto &e: to_clear) {
auto &pin = get_pin(*e);
- DEBUGT("checking {}, {}", t, *e, pin);
+ TRACET("checking extent {} -- {}", t, pin, *e);
pin_set.check_parent(pin);
}
}
CachedExtentRef e)
{
LOG_PREFIX(BtreeLBAManager::init_cached_extent);
- DEBUGT("extent {}", t, *e);
- return seastar::do_with(bool(), [this, e, &t](bool& ret) {
+ TRACET("{}", t, *e);
+ return seastar::do_with(bool(), [this, e, FNAME, &t](bool& ret) {
auto c = get_context(t);
return with_btree(c, [c, e, &ret](auto &btree) {
return btree.init_cached_extent(c, e
).si_then([&ret](bool is_alive) {
ret = is_alive;
});
- }).si_then([&ret] {
+ }).si_then([&ret, e, FNAME, c] {
+ DEBUGT("is_alive={} -- {}", c.trans, ret, *e);
return ret;
});
});
scan_mapped_space_func_t &&f)
{
LOG_PREFIX(BtreeLBAManager::scan_mapped_space);
- DEBUGT("", t);
+ DEBUGT("start", t);
auto c = get_context(t);
return seastar::do_with(
std::move(f),
{
LOG_PREFIX(BtreeLBAManager::rewrite_extent);
if (extent->has_been_invalidated()) {
- ERRORT("{} has been invalidated", t, *extent);
+ ERRORT("extent has been invalidated -- {}", t, *extent);
+ ceph_abort();
}
- assert(!extent->has_been_invalidated());
assert(!extent->is_logical());
- DEBUGT("rewriting {}", t, *extent);
-
if (is_lba_node(*extent)) {
+ DEBUGT("rewriting lba extent -- {}", t, *extent);
auto c = get_context(t);
return with_btree(
c,
return btree.rewrite_lba_extent(c, extent);
});
} else {
+ DEBUGT("skip non lba extent -- {}", t, *extent);
return rewrite_extent_iertr::now();
}
}
paddr_t prev_addr,
paddr_t addr)
{
+ LOG_PREFIX(BtreeLBAManager::update_mapping);
+ TRACET("laddr={}, paddr {} => {}", t, laddr, prev_addr, addr);
return update_mapping(
t,
laddr,
ceph_assert(in.paddr == prev_addr);
ret.paddr = addr;
return ret;
- }).si_then(
- [](auto) {},
- update_le_mapping_iertr::pass_further{},
- /* ENOENT in particular should be impossible */
- crimson::ct_error::assert_all{
- "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
- }
- );
+ }
+ ).si_then([&t, laddr, prev_addr, addr, FNAME](auto result) {
+ DEBUGT("laddr={}, paddr {} => {} done -- {}",
+ t, laddr, prev_addr, addr, result);
+ },
+ update_le_mapping_iertr::pass_further{},
+ /* ENOENT in particular should be impossible */
+ crimson::ct_error::assert_all{
+ "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
+ }
+ );
}
BtreeLBAManager::get_physical_extent_if_live_ret
laddr_t laddr,
seastore_off_t len)
{
+ LOG_PREFIX(BtreeLBAManager::get_physical_extent_if_live);
+ DEBUGT("{}, laddr={}, paddr={}, length={}",
+ t, type, laddr, addr, len);
ceph_assert(is_lba_node(type));
auto c = get_context(t);
return with_btree_ret<CachedExtentRef>(
void BtreeLBAManager::register_metrics()
{
+ LOG_PREFIX(BtreeLBAManager::register_metrics);
+ DEBUG("start");
stats = {};
namespace sm = seastar::metrics;
metrics.add_group(
int delta)
{
LOG_PREFIX(BtreeLBAManager::update_refcount);
- DEBUGT("addr {}, delta {}", t, addr, delta);
+ TRACET("laddr={}, delta={}", t, addr, delta);
return update_mapping(
t,
addr,
ceph_assert((int)out.refcount + delta >= 0);
out.refcount += delta;
return out;
- }).si_then([](auto result) {
- return ref_update_result_t{
- result.refcount,
- result.paddr,
- result.len
- };
- });
+ }
+ ).si_then([&t, addr, delta, FNAME](auto result) {
+ DEBUGT("laddr={}, delta={} done -- {}", t, addr, delta, result);
+ return ref_update_result_t{
+ result.refcount,
+ result.paddr,
+ result.len
+ };
+ });
}
BtreeLBAManager::update_mapping_ret BtreeLBAManager::update_mapping(
laddr_t addr,
update_func_t &&f)
{
- LOG_PREFIX(BtreeLBAManager::update_mapping);
- DEBUGT("addr {}", t, addr);
auto c = get_context(t);
return with_btree_ret<lba_map_val_t>(
c,
).si_then([&btree, f=std::move(f), c, addr](auto iter)
-> update_mapping_ret {
if (iter.is_end() || iter.get_key() != addr) {
+ LOG_PREFIX(BtreeLBAManager::update_mapping);
+ DEBUGT("laddr={} doesn't exist", c.trans, addr);
return crimson::ct_error::enoent::make();
}
{
pin_set.scan([](auto &i) {
LOG_PREFIX(BtreeLBAManager::~BtreeLBAManager);
- ERROR("Found {} {} has_ref={}", i, i.get_extent(), i.has_ref());
+ ERROR("Found {}, has_ref={} -- {}",
+ i, i.has_ref(), i.get_extent());
});
}