/// Creates empty transaction by source
TransactionRef create_transaction(
- Transaction::src_t src) {
+ Transaction::src_t src,
+ const char* name,
+ bool is_weak) {
LOG_PREFIX(Cache::create_transaction);
++(get_by_src(stats.trans_created_by_src, src));
auto ret = std::make_unique<Transaction>(
get_dummy_ordering_handle(),
- false,
- src,
- last_commit,
- [this](Transaction& t) {
- return on_transaction_destruct(t);
- }
- );
- DEBUGT("created source={}", *ret, src);
- return ret;
- }
-
- /// Creates empty weak transaction by source
- TransactionRef create_weak_transaction(
- Transaction::src_t src) {
- LOG_PREFIX(Cache::create_weak_transaction);
-
- ++(get_by_src(stats.trans_created_by_src, src));
-
- auto ret = std::make_unique<Transaction>(
- get_dummy_ordering_handle(),
- true,
+ is_weak,
src,
last_commit,
[this](Transaction& t) {
return on_transaction_destruct(t);
}
);
- DEBUGT("created source={}", *ret, src);
+ DEBUGT("created name={}, source={}, is_weak={}",
+ *ret, name, src, is_weak);
return ret;
}
}).safe_then([this] {
return repeat_eagain([this] {
return transaction_manager->with_transaction_intr(
- Transaction::src_t::MUTATE, [this](auto& t) {
+ Transaction::src_t::MUTATE,
+ "mkfs_seastore",
+ [this](auto& t)
+ {
return onode_manager->mkfs(t
).si_then([this, &t] {
return collection_manager->mkfs(t);
[this, start, end, limit] (auto& ret) {
return repeat_eagain([this, start, end, limit, &ret] {
return transaction_manager->with_transaction_intr(
- Transaction::src_t::READ,
- [this, start, end, limit](auto &t) {
+ Transaction::src_t::READ,
+ "list_objects",
+ [this, start, end, limit](auto &t)
+ {
return onode_manager->list_onodes(t, start, end, limit);
}).safe_then([&ret](auto&& _ret) {
ret = std::move(_ret);
[this](auto &ret) {
return repeat_eagain([this, &ret] {
return transaction_manager->with_transaction_intr(
- Transaction::src_t::READ,
- [this, &ret](auto& t) {
+ Transaction::src_t::READ,
+ "list_collections",
+ [this, &ret](auto& t)
+ {
return transaction_manager->read_collection_root(t
).si_then([this, &t](auto coll_root) {
return collection_manager->list(coll_root, t);
ch,
oid,
Transaction::src_t::READ,
+ "read_obj",
op_type_t::READ,
[=](auto &t, auto &onode) -> ObjectDataHandler::read_ret {
size_t size = onode.get_layout().size;
c,
oid,
Transaction::src_t::READ,
+ "get_attr",
op_type_t::GET_ATTR,
[=](auto &t, auto& onode) -> _omap_get_value_ret {
auto& layout = onode.get_layout();
c,
oid,
Transaction::src_t::READ,
+ "get_addrs",
op_type_t::GET_ATTRS,
[=](auto &t, auto& onode) {
auto& layout = onode.get_layout();
c,
oid,
Transaction::src_t::READ,
+ "stat",
op_type_t::STAT,
[=, &oid](auto &t, auto &onode) {
struct stat st;
c,
oid,
Transaction::src_t::READ,
+ "omap_get_values",
op_type_t::OMAP_GET_VALUES,
[this, keys](auto &t, auto &onode) {
omap_root_t omap_root = onode.get_layout().omap_root.get(onode.get_hint());
c,
oid,
Transaction::src_t::READ,
+ "omap_list",
op_type_t::OMAP_LIST,
[this, config, &start](auto &t, auto &onode) {
return _omap_list(
_ch,
std::move(_t),
Transaction::src_t::MUTATE,
+ "do_transaction",
op_type_t::TRANSACTION,
[this](auto &ctx) {
return with_trans_intr(*ctx.transaction, [&, this](auto &t) {
return repeat_eagain([this, FNAME, &key, &value] {
return transaction_manager->with_transaction_intr(
Transaction::src_t::MUTATE,
- [this, FNAME, &key, &value](auto& t) {
- DEBUGT("Have transaction, key: {}; value: {}", t, key, value);
- return transaction_manager->update_root_meta(
- t, key, value
- ).si_then([this, &t] {
- return transaction_manager->submit_transaction(t);
- });
- });
+ "write_meta",
+ [this, FNAME, &key, &value](auto& t)
+ {
+ DEBUGT("Have transaction, key: {}; value: {}", t, key, value);
+ return transaction_manager->update_root_meta(
+ t, key, value
+ ).si_then([this, &t] {
+ return transaction_manager->submit_transaction(t);
+ });
+ });
}).safe_then([this, &key, &value] {
return mdstore->write_meta(key, value);
});
CollectionRef ch,
ceph::os::Transaction &&t,
Transaction::src_t src,
+ const char* tname,
op_type_t op_type,
F &&f) {
return seastar::do_with(
internal_context_t(
ch, std::move(t),
- transaction_manager->create_transaction(src)),
+ transaction_manager->create_transaction(src, tname)),
std::forward<F>(f),
[this, op_type](auto &ctx, auto &f) {
return ctx.transaction->get_handle().take_collection_lock(
CollectionRef ch,
const ghobject_t &oid,
Transaction::src_t src,
+ const char* tname,
op_type_t op_type,
F &&f) const {
auto begin_time = std::chrono::steady_clock::now();
return seastar::do_with(
- oid, Ret{}, OnodeRef(), std::forward<F>(f),
- [this, src, op_type, begin_time](auto &oid, auto &ret, auto &onode, auto &f) {
- return repeat_eagain([&, this, src] {
+ oid, Ret{}, OnodeRef(), std::forward<F>(f),
+ [this, src, op_type, begin_time, tname
+ ](auto &oid, auto &ret, auto &onode, auto &f)
+ {
+ return repeat_eagain([&, this, src, tname] {
return transaction_manager->with_transaction_intr(
- src, [&, this](auto& t) {
+ src,
+ tname,
+ [&, this](auto& t)
+ {
return onode_manager->get_onode(t, oid
).si_then([&](auto onode_ret) {
onode = std::move(onode_ret);
{
return repeat_eagain([this] {
return ecb->with_transaction_intr(
- Transaction::src_t::CLEANER_TRIM, [this](auto& t) {
+ Transaction::src_t::CLEANER_TRIM,
+ "trim_journal",
+ [this](auto& t)
+ {
return rewrite_dirty(t, get_dirty_tail()
).si_then([this, &t] {
return ecb->submit_transaction_direct(t);
"SegmentCleaner::gc_reclaim_space: processing {} extents",
extents.size());
return ecb->with_transaction_intr(
- Transaction::src_t::CLEANER_RECLAIM,
- [this, &extents](auto& t) {
+ Transaction::src_t::CLEANER_RECLAIM,
+ "reclaim_space",
+ [this, &extents](auto& t)
+ {
return trans_intr::do_for_each(
extents,
[this, &t](auto &extent) {
public:
virtual ~ExtentCallbackInterface() = default;
- virtual TransactionRef create_transaction(Transaction::src_t) = 0;
+ virtual TransactionRef create_transaction(
+ Transaction::src_t, const char*) = 0;
/// Creates empty transaction with interruptible context
template <typename Func>
- auto with_transaction_intr(Transaction::src_t src, Func &&f) {
+ auto with_transaction_intr(
+ Transaction::src_t src,
+ const char* name,
+ Func &&f) {
return seastar::do_with(
- create_transaction(src),
+ create_transaction(src, name),
[f=std::forward<Func>(f)](auto &ref_t) mutable {
return with_trans_intr(
*ref_t,
DEBUG("about to do_with");
segment_cleaner->init_mkfs(addr);
return with_transaction_intr(
- Transaction::src_t::MUTATE, [this, FNAME](auto& t) {
+ Transaction::src_t::MUTATE,
+ "mkfs_tm",
+ [this, FNAME](auto& t)
+ {
DEBUGT("about to cache->mkfs", t);
cache->init();
return cache->mkfs(t
}).safe_then([this, FNAME](auto addr) {
segment_cleaner->set_journal_head(addr);
return seastar::do_with(
- create_weak_transaction(Transaction::src_t::READ),
+ create_weak_transaction(
+ Transaction::src_t::READ, "mount"),
[this, FNAME](auto &tref) {
return with_trans_intr(
*tref,
/// Creates empty transaction
TransactionRef create_transaction(
- Transaction::src_t src) final {
- return cache->create_transaction(src);
+ Transaction::src_t src,
+ const char* name) final {
+ return cache->create_transaction(src, name, false);
}
/// Creates empty weak transaction
TransactionRef create_weak_transaction(
- Transaction::src_t src) {
- return cache->create_weak_transaction(src);
+ Transaction::src_t src,
+ const char* name) {
+ return cache->create_transaction(src, name, true);
}
/// Resets transaction
return seastar::do_with(ptr, [this, offset](auto& ptr) {
return repeat_eagain([this, offset, &ptr] {
return tm->with_transaction_intr(
- Transaction::src_t::MUTATE,
- [this, offset, &ptr](auto& t) {
+ Transaction::src_t::MUTATE,
+ "write",
+ [this, offset, &ptr](auto& t)
+ {
return tm->dec_ref(t, offset
).si_then([](auto){}).handle_error_interruptible(
crimson::ct_error::enoent::handle([](auto) { return seastar::now(); }),
auto &blret = *blptrret;
return repeat_eagain([=, &blret] {
return tm->with_transaction_intr(
- Transaction::src_t::READ,
- [=, &blret](auto& t) {
+ Transaction::src_t::READ,
+ "read",
+ [=, &blret](auto& t)
+ {
return read_extents(t, offset, size
).si_then([=, &blret](auto ext_list) {
size_t cur = offset;
return journal->open_for_write();
}).safe_then([this](auto addr) {
return seastar::do_with(
- cache->create_transaction(Transaction::src_t::MUTATE),
+ cache->create_transaction(
+ Transaction::src_t::MUTATE, "test_set_up_fut", false),
[this](auto &ref_t) {
return with_trans_intr(*ref_t, [&](auto &t) {
cache->init();
template <typename F>
auto lba_btree_update(F &&f) {
- auto tref = cache->create_transaction(Transaction::src_t::MUTATE);
+ auto tref = cache->create_transaction(
+ Transaction::src_t::MUTATE, "test_btree_update", false);
auto &t = *tref;
with_trans_intr(
t,
template <typename F>
auto lba_btree_read(F &&f) {
- auto t = cache->create_transaction(Transaction::src_t::READ);
+ auto t = cache->create_transaction(
+ Transaction::src_t::READ, "test_btree_read", false);
return with_trans_intr(
*t,
[this, f=std::forward<F>(f)](auto &t) mutable {
auto create_transaction(bool create_fake_extent=true) {
auto t = test_transaction_t{
- cache->create_transaction(Transaction::src_t::MUTATE),
+ cache->create_transaction(
+ Transaction::src_t::MUTATE, "test_mutate_lba", false),
test_lba_mappings
};
if (create_fake_extent) {
auto create_weak_transaction() {
auto t = test_transaction_t{
- cache->create_weak_transaction(Transaction::src_t::READ),
+ cache->create_transaction(
+ Transaction::src_t::READ, "test_read_weak", true),
test_lba_mappings
};
return t;
}
auto get_transaction() {
- return cache->create_transaction(Transaction::src_t::MUTATE);
+ return cache->create_transaction(
+ Transaction::src_t::MUTATE, "test_cache", false);
}
template <typename T, typename... Args>
}
auto create_mutate_transaction() {
- return tm->create_transaction(Transaction::src_t::MUTATE);
+ return tm->create_transaction(
+ Transaction::src_t::MUTATE, "test_mutate");
}
auto create_read_transaction() {
- return tm->create_transaction(Transaction::src_t::READ);
+ return tm->create_transaction(
+ Transaction::src_t::READ, "test_read");
}
auto create_weak_transaction() {
- return tm->create_weak_transaction(Transaction::src_t::READ);
+ return tm->create_weak_transaction(
+ Transaction::src_t::READ, "test_read_weak");
}
auto submit_transaction_fut2(Transaction& t) {