retired_extent_gate_t retired_extent_gate;
- /// Creates empty transaction
- TransactionRef create_transaction() {
+ /// Creates empty transaction by source
+ TransactionRef create_transaction(
+ Transaction::src_t src) {
LOG_PREFIX(Cache::create_transaction);
auto ret = std::make_unique<Transaction>(
get_dummy_ordering_handle(),
false,
+ src,
last_commit
);
retired_extent_gate.add_token(ret->retired_gate_token);
- DEBUGT("created", *ret);
+ DEBUGT("created source={}", *ret, src);
return ret;
}
- /// Creates empty weak transaction
- TransactionRef create_weak_transaction() {
+ /// Creates empty weak transaction by source
+ TransactionRef create_weak_transaction(
+ Transaction::src_t src) {
LOG_PREFIX(Cache::create_weak_transaction);
auto ret = std::make_unique<Transaction>(
get_dummy_ordering_handle(),
true,
+ src,
last_commit
);
retired_extent_gate.add_token(ret->retired_gate_token);
- DEBUGT("created", *ret);
+ DEBUGT("created source={}", *ret, src);
return ret;
}
return transaction_manager->mount();
}).safe_then([this] {
return seastar::do_with(
- transaction_manager->create_transaction(),
+ transaction_manager->create_transaction(
+ Transaction::src_t::MUTATE),
[this](auto &t) {
return onode_manager->mkfs(*t
).safe_then([this, &t] {
[this, start, end, limit] (auto& ret) {
return repeat_eagain2([this, start, end, limit, &ret] {
return seastar::do_with(
- transaction_manager->create_transaction(),
+ transaction_manager->create_transaction(
+ Transaction::src_t::READ),
[this, start, end, limit, &ret] (auto& t) {
return onode_manager->list_onodes(*t, start, end, limit
).safe_then([&ret] (auto&& _ret) {
return repeat_eagain([this, &ret] {
return seastar::do_with(
- transaction_manager->create_transaction(),
+ transaction_manager->create_transaction(
+ Transaction::src_t::READ),
[this, &ret](auto &t) {
return transaction_manager->read_collection_root(*t
).safe_then([this, &t](auto coll_root) {
return repeat_with_onode<ceph::bufferlist>(
ch,
oid,
+ Transaction::src_t::READ,
[=](auto &t, auto &onode) -> ObjectDataHandler::read_ret {
size_t size = onode.get_layout().size;
LOG_PREFIX(SeaStore::get_attr);
DEBUG("{} {}", c->get_cid(), oid);
return repeat_with_onode<ceph::bufferlist>(
- c, oid, [=](auto &t, auto& onode)
- -> _omap_get_value_ertr::future<ceph::bufferlist> {
- auto& layout = onode.get_layout();
- if (name == OI_ATTR && layout.oi_size) {
- ceph::bufferlist bl;
- bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
- return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
- }
- if (name == SS_ATTR && layout.ss_size) {
- ceph::bufferlist bl;
- bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
- return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+ c,
+ oid,
+ Transaction::src_t::READ,
+ [=](auto &t, auto& onode) -> _omap_get_value_ertr::future<ceph::bufferlist> {
+ auto& layout = onode.get_layout();
+ if (name == OI_ATTR && layout.oi_size) {
+ ceph::bufferlist bl;
+ bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
+ return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+ }
+ if (name == SS_ATTR && layout.ss_size) {
+ ceph::bufferlist bl;
+ bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
+ return seastar::make_ready_future<ceph::bufferlist>(std::move(bl));
+ }
+ return _omap_get_value(
+ t,
+ layout.xattr_root.get(),
+ name);
}
- return _omap_get_value(
- t,
- layout.xattr_root.get(),
- name);
- }).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
+ ).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
ERROR("EIO when getting attrs");
abort();
}), crimson::ct_error::pass_further_all{});
auto c = static_cast<SeastoreCollection*>(ch.get());
DEBUG("{} {}", c->get_cid(), oid);
return repeat_with_onode<attrs_t>(
- c, oid, [=](auto &t, auto& onode) {
- auto& layout = onode.get_layout();
- return _omap_list(layout.xattr_root, t, std::nullopt,
- OMapManager::omap_list_config_t::with_inclusive(false)
- ).safe_then([&layout](auto p) {
- auto& attrs = std::get<1>(p);
- ceph::bufferlist bl;
- if (layout.oi_size) {
- bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
- attrs.emplace(OI_ATTR, std::move(bl));
- }
- if (layout.ss_size) {
- bl.clear();
- bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
- attrs.emplace(SS_ATTR, std::move(bl));
- }
- return seastar::make_ready_future<omap_values_t>(std::move(attrs));
- });
- }).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
+ c,
+ oid,
+ Transaction::src_t::READ,
+ [=](auto &t, auto& onode) {
+ auto& layout = onode.get_layout();
+ return _omap_list(layout.xattr_root, t, std::nullopt,
+ OMapManager::omap_list_config_t::with_inclusive(false)
+ ).safe_then([&layout](auto p) {
+ auto& attrs = std::get<1>(p);
+ ceph::bufferlist bl;
+ if (layout.oi_size) {
+ bl.append(ceph::bufferptr(&layout.oi[0], layout.oi_size));
+ attrs.emplace(OI_ATTR, std::move(bl));
+ }
+ if (layout.ss_size) {
+ bl.clear();
+ bl.append(ceph::bufferptr(&layout.ss[0], layout.ss_size));
+ attrs.emplace(SS_ATTR, std::move(bl));
+ }
+ return seastar::make_ready_future<omap_values_t>(std::move(attrs));
+ });
+ }
+ ).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
ERROR("EIO when getting attrs");
abort();
}), crimson::ct_error::pass_further_all{});
return repeat_with_onode<struct stat>(
c,
oid,
+ Transaction::src_t::READ,
[=, &oid](auto &t, auto &onode) {
struct stat st;
auto &olayout = onode.get_layout();
st.st_nlink = 1;
DEBUGT("cid {}, oid {}, return size {}", t, c->get_cid(), oid, st.st_size);
return seastar::make_ready_future<struct stat>(st);
- }).handle_error(
- crimson::ct_error::assert_all{
- "Invalid error in SeaStore::stat"
- }
- );
+ }
+ ).handle_error(
+ crimson::ct_error::assert_all{
+ "Invalid error in SeaStore::stat"
+ }
+ );
}
auto
return repeat_with_onode<omap_values_t>(
c,
oid,
+ Transaction::src_t::READ,
[this, keys](auto &t, auto &onode) {
omap_root_t omap_root = onode.get_layout().omap_root.get();
return _omap_get_values(
return repeat_with_onode<ret_bare_t>(
c,
oid,
+ Transaction::src_t::READ,
[this, config, &start](auto &t, auto &onode) {
return _omap_list(
onode.get_layout().omap_root,
return repeat_with_internal_context(
_ch,
std::move(_t),
+ Transaction::src_t::MUTATE,
[this](auto &ctx) {
return onode_manager->get_or_create_onodes(
*ctx.transaction, ctx.iter.get_objects()
value,
[this, FNAME](auto &t, auto& key, auto& value) {
return repeat_eagain([this, FNAME, &t, &key, &value] {
- t = transaction_manager->create_transaction();
+ t = transaction_manager->create_transaction(
+ Transaction::src_t::MUTATE);
DEBUGT("Have transaction, key: {}; value: {}", *t, key, value);
return transaction_manager->update_root_meta(
*t, key, value
key,
[this](auto &ret, auto &t, auto& key) {
return repeat_eagain([this, &ret, &t, &key] {
- t = transaction_manager->create_transaction();
+ t = transaction_manager->create_transaction(
+ Transaction::src_t::READ);
return transaction_manager->read_root_meta(
*t, key
).safe_then([&ret](auto v) {
auto repeat_with_internal_context(
CollectionRef ch,
ceph::os::Transaction &&t,
+ Transaction::src_t src,
F &&f) {
return seastar::do_with(
internal_context_t(
ch, std::move(t),
- transaction_manager->create_transaction()),
+ transaction_manager->create_transaction(src)),
std::forward<F>(f),
[this](auto &ctx, auto &f) {
return ctx.transaction->get_handle().take_collection_lock(
auto repeat_with_onode(
CollectionRef ch,
const ghobject_t &oid,
+ Transaction::src_t src,
F &&f) const {
return seastar::do_with(
oid,
OnodeRef(),
std::forward<F>(f),
[=](auto &oid, auto &ret, auto &t, auto &onode, auto &f) {
- return repeat_eagain([&, this] {
- t = transaction_manager->create_transaction();
+ return repeat_eagain([&, this, src] {
+ t = transaction_manager->create_transaction(src);
return onode_manager->get_onode(
*t, oid
).safe_then([&](auto onode_ret) {
return repeat_eagain(
[this] {
return seastar::do_with(
- ecb->create_transaction(),
+ ecb->create_transaction(Transaction::src_t::CLEANER),
[this](auto &tref) {
return with_trans_intr(*tref, [this](auto &t) {
return rewrite_dirty(t, get_dirty_tail()
"SegmentCleaner::gc_reclaim_space: processing {} extents",
extents.size());
return seastar::do_with(
- ecb->create_transaction(),
+ ecb->create_transaction(Transaction::src_t::CLEANER),
[this, &extents](auto &tref) mutable {
return with_trans_intr(*tref, [this, &extents](auto &t) {
return trans_intr::do_for_each(
public:
virtual ~ExtentCallbackInterface() = default;
- virtual TransactionRef create_transaction() = 0;
+ virtual TransactionRef create_transaction(Transaction::src_t) = 0;
/**
* get_next_dirty_extent
return retired_set;
}
+ enum class src_t : uint8_t {
+ // normal IO operations at seastore boundary or within a test
+ MUTATE = 0,
+ READ,
+ // transaction manager level operations
+ INIT,
+ CLEANER,
+ MAX
+ };
+ static constexpr auto SRC_MAX = static_cast<std::size_t>(src_t::MAX);
+ src_t get_src() const {
+ return src;
+ }
+
bool is_weak() const {
return weak;
}
Transaction(
OrderingHandle &&handle,
bool weak,
+ src_t src,
journal_seq_t initiated_after
) : weak(weak),
retired_gate_token(initiated_after),
- handle(std::move(handle))
+ handle(std::move(handle)),
+ src(src)
{}
bool conflicted = false;
OrderingHandle handle;
+
+ const src_t src;
};
using TransactionRef = Transaction::Ref;
+inline std::ostream& operator<<(std::ostream& os,
+ const Transaction::src_t& src) {
+ switch (src) {
+ case Transaction::src_t::MUTATE:
+ return os << "MUTATE";
+ case Transaction::src_t::READ:
+ return os << "READ";
+ case Transaction::src_t::INIT:
+ return os << "INIT";
+ case Transaction::src_t::CLEANER:
+ return os << "CLEANER";
+ default:
+ ceph_abort("impossible");
+ }
+}
+
/// Should only be used with dummy staged-fltree node extent manager
inline TransactionRef make_test_transaction() {
return std::make_unique<Transaction>(
get_dummy_ordering_handle(),
false,
+ Transaction::src_t::MUTATE,
journal_seq_t{}
);
}
DEBUG("about to do_with");
segment_cleaner->init_mkfs(addr);
return seastar::do_with(
- create_transaction(),
+ create_transaction(Transaction::src_t::INIT),
[this, FNAME](auto &transaction) {
DEBUGT(
"about to cache->mkfs",
}).safe_then([this, FNAME](auto addr) {
segment_cleaner->set_journal_head(addr);
return seastar::do_with(
- create_weak_transaction(),
+ create_weak_transaction(Transaction::src_t::INIT),
[this, FNAME](auto &tref) {
return with_trans_intr(
*tref,
close_ertr::future<> close();
/// Creates empty transaction
- TransactionRef create_transaction() final {
- return cache->create_transaction();
+ TransactionRef create_transaction(
+ Transaction::src_t src) final {
+ return cache->create_transaction(src);
}
/// Creates empty weak transaction
- TransactionRef create_weak_transaction() {
- return cache->create_weak_transaction();
+ TransactionRef create_weak_transaction(
+ Transaction::src_t src) {
+ return cache->create_weak_transaction(src);
}
/// Resets transaction
assert((ptr.length() % (size_t)segment_manager->get_block_size()) == 0);
return repeat_eagain([this, offset, ptr=std::move(ptr)] {
return seastar::do_with(
- tm->create_transaction(),
+ tm->create_transaction(Transaction::src_t::MUTATE),
ptr,
[this, offset](auto &t, auto &ptr) mutable {
return tm->dec_ref(
auto &blret = *blptrret;
return repeat_eagain([=, &blret] {
return seastar::do_with(
- tm->create_transaction(),
+ tm->create_transaction(Transaction::src_t::READ),
[=, &blret](auto &t) {
return read_extents(*t, offset, size
).safe_then([=, &blret](auto ext_list) mutable {
return tm->mount(
).safe_then([this] {
return seastar::do_with(
- tm->create_transaction(),
+ create_mutate_transaction(),
[this](auto &t) {
return manager->mkfs(*t
).safe_then([this, &t] {
template <typename F>
void with_transaction(F&& f) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
std::invoke(f, *t);
submit_transaction(std::move(t));
segment_cleaner->run_until_halt().get0();
auto tree = std::make_unique<TreeBuilder<TRACK_CURSORS, BoundedValue>>(
kvs, std::move(moved_nm));
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->bootstrap(*t).unsafe_get();
submit_transaction(std::move(t));
segment_cleaner->run_until_halt().get0();
// test insert
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->insert(*t).unsafe_get();
submit_transaction(std::move(t));
segment_cleaner->run_until_halt().get0();
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get();
}
if constexpr (TEST_SEASTORE) {
logger().info("seastore replay insert end");
}
{
- // Note: tm->create_weak_transaction() can also work, but too slow.
- auto t = tm->create_transaction();
+ // Note: create_weak_transaction() can also work, but too slow.
+ auto t = create_read_transaction();
tree->validate(*t).unsafe_get();
}
// test erase 3/4
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->erase(*t, kvs.size() / 4 * 3).unsafe_get();
submit_transaction(std::move(t));
segment_cleaner->run_until_halt().get0();
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get();
}
if constexpr (TEST_SEASTORE) {
logger().info("seastore replay erase-1 end");
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->validate(*t).unsafe_get();
}
// test erase remaining
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->erase(*t, kvs.size()).unsafe_get();
submit_transaction(std::move(t));
segment_cleaner->run_until_halt().get0();
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get();
}
if constexpr (TEST_SEASTORE) {
logger().info("seastore replay erase-2 end");
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->validate(*t).unsafe_get();
EXPECT_EQ(tree->height(*t).unsafe_get0(), 1);
}
repeat_eagain([this, &tree, &num_ops_eagain] {
++num_ops_eagain;
return seastar::do_with(
- tm->create_transaction(),
+ create_mutate_transaction(),
[this, &tree](auto &t) {
return tree->bootstrap(*t
).safe_then([this, &t] {
repeat_eagain([this, &tree, &num_ops_eagain, &iter] {
++num_ops_eagain;
return seastar::do_with(
- tm->create_transaction(),
+ create_mutate_transaction(),
[this, &tree, &iter](auto &t) {
return tree->insert_one(*t, iter
).safe_then([this, &t](auto cursor) {
{
p_nm->set_generate_eagain(false);
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get0();
p_nm->set_generate_eagain(true);
}
++num_ops;
repeat_eagain2([this, &tree, &num_ops_eagain, &iter] {
++num_ops_eagain;
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
return tree->validate_one(*t, iter
).safe_then([t=std::move(t)]{});
}).get0();
repeat_eagain([this, &tree, &num_ops_eagain, &iter] {
++num_ops_eagain;
return seastar::do_with(
- tm->create_transaction(),
+ create_mutate_transaction(),
[this, &tree, &iter](auto &t) {
return tree->erase_one(*t, iter
).safe_then([this, &t] () mutable {
{
p_nm->set_generate_eagain(false);
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get0();
tree->validate(*t).unsafe_get0();
EXPECT_EQ(tree->height(*t).unsafe_get0(), 1);
return journal.open_for_write();
}).safe_then([this](auto addr) {
return seastar::do_with(
- cache.create_transaction(),
+ cache.create_transaction(Transaction::src_t::MUTATE),
[this](auto &transaction) {
cache.init();
return cache.mkfs(*transaction
auto create_transaction() {
auto t = test_transaction_t{
- cache.create_transaction(),
+ cache.create_transaction(Transaction::src_t::MUTATE),
test_lba_mappings
};
cache.alloc_new_extent<TestBlockPhysical>(*t.t, TestBlockPhysical::SIZE);
auto create_weak_transaction() {
auto t = test_transaction_t{
- cache.create_weak_transaction(),
+ cache.create_weak_transaction(Transaction::src_t::READ),
test_lba_mappings
};
return t;
}
auto get_root() {
- auto tref = tm->create_transaction();
+ auto tref = create_mutate_transaction();
auto coll_root = with_trans_intr(
*tref,
[this](auto &t) {
}
void checking_mappings(coll_root_t &coll_root) {
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
checking_mappings(coll_root, *t);
}
};
run_async([this] {
coll_root_t coll_root = get_root();
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (int i = 0; i < 20; i++) {
coll_t cid(spg_t(pg_t(i+1,i+2), shard_id_t::NO_SHARD));
create(coll_root, *t, cid, coll_info_t(i));
replay();
checking_mappings(coll_root);
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (auto iter = test_coll_mappings.begin();
iter != test_coll_mappings.end();) {
remove(coll_root, *t, iter->first);
}
replay();
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
auto list_ret = list(coll_root, *t);
submit_transaction(std::move(t));
EXPECT_EQ(list_ret.size(), test_coll_mappings.size());
coll_root_t coll_root = get_root();
auto old_location = coll_root.get_location();
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (int i = 0; i < 412; i++) {
coll_t cid(spg_t(pg_t(i+1,i+2), shard_id_t::NO_SHARD));
create(coll_root, *t, cid, coll_info_t(i));
run_async([this] {
coll_root_t coll_root = get_root();
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (int i = 0; i < 2; i++) {
coll_t cid(spg_t(pg_t(1,i+1), shard_id_t::NO_SHARD));
create(coll_root, *t, cid, coll_info_t(i));
auto iter1= test_coll_mappings.begin();
auto iter2 = std::next(test_coll_mappings.begin(), 1);
EXPECT_NE(iter1->second.split_bits, iter2->second.split_bits);
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
update(coll_root, *t, iter1->first, iter2->second);
submit_transaction(std::move(t));
iter1->second.split_bits = iter2->second.split_bits;
bl).unsafe_get0();
}
void write(objaddr_t offset, extent_len_t len, char fill) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
write(*t, offset, len, fill);
return submit_transaction(std::move(t));
}
size = offset;
}
void truncate(objaddr_t offset) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
truncate(*t, offset);
return submit_transaction(std::move(t));
}
EXPECT_EQ(bl, known);
}
void read(objaddr_t offset, extent_len_t len) {
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
read(*t, offset, len);
}
void read_near(objaddr_t offset, extent_len_t len, extent_len_t fuzz) {
}
void check_mappings(omap_root_t &omap_root) {
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
check_mappings(omap_root, *t);
}
}
auto initialize() {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
omap_root_t omap_root = with_trans_intr(
*t,
[this](auto &t) {
string val = "test";
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("first transaction");
set_key(omap_root, *t, key, val);
get_value(omap_root, *t, key);
submit_transaction(std::move(t));
}
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("second transaction");
get_value(omap_root, *t, key);
rm_key(omap_root, *t, key);
submit_transaction(std::move(t));
}
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("third transaction");
get_value(omap_root, *t, key);
submit_transaction(std::move(t));
omap_root_t omap_root = initialize();
for (unsigned i = 0; i < 40; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("opened transaction");
for (unsigned j = 0; j < 10; ++j) {
set_random_key(omap_root, *t);
omap_root_t omap_root = initialize();
for (unsigned i = 0; i < 80; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("opened split_merge transaction");
for (unsigned j = 0; j < 5; ++j) {
set_random_key(omap_root, *t);
}
}
auto mkeys = get_mapped_keys();
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned i = 0; i < mkeys.size(); i++) {
if (i % 3 != 0) {
rm_key(omap_root, *t, mkeys[i]);
if (i % 10 == 0) {
logger().debug("submitting transaction i= {}", i);
submit_transaction(std::move(t));
- t = tm->create_transaction();
+ t = create_mutate_transaction();
}
if (i % 100 == 0) {
logger().debug("check_mappings i= {}", i);
omap_root_t omap_root = initialize();
for (unsigned i = 0; i < 50; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("opened split_merge transaction");
for (unsigned j = 0; j < 5; ++j) {
set_random_key(omap_root, *t);
}
}
auto mkeys = get_mapped_keys();
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned i = 0; i < mkeys.size(); i++) {
if (30 < i && i < 100) {
rm_key(omap_root, *t, mkeys[i]);
if (i % 10 == 0) {
logger().debug("submitting transaction i= {}", i);
submit_transaction(std::move(t));
- t = tm->create_transaction();
+ t = create_mutate_transaction();
}
if (i % 50 == 0) {
logger().debug("check_mappings i= {}", i);
string temp;
for (unsigned i = 0; i < 40; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
logger().debug("opened transaction");
for (unsigned j = 0; j < 10; ++j) {
auto key = set_random_key(omap_root, *t);
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
list(omap_root, *t, std::nullopt);
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
list(omap_root, *t, temp, 100);
}
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
clear(omap_root, *t);
submit_transaction(std::move(t));
}
for (unsigned i = 0; i < 10; i++) {
logger().debug("opened split transaction");
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned j = 0; j < 80; ++j) {
set_random_key(omap_root, *t);
for (unsigned i = 0; i < 8; i++) {
logger().debug("opened split transaction");
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned j = 0; j < 80; ++j) {
set_random_key(omap_root, *t);
submit_transaction(std::move(t));
}
auto mkeys = get_mapped_keys();
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned i = 0; i < mkeys.size(); i++) {
rm_key(omap_root, *t, mkeys[i]);
if (i % 10 == 0) {
logger().debug("submitting transaction i= {}", i);
submit_transaction(std::move(t));
- t = tm->create_transaction();
+ t = create_mutate_transaction();
}
if (i % 50 == 0) {
logger().debug("check_mappings i= {}", i);
for (unsigned i = 0; i < 8; i++) {
logger().debug("opened split transaction");
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned j = 0; j < 80; ++j) {
set_random_key(omap_root, *t);
check_mappings(omap_root);
auto mkeys = get_mapped_keys();
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned i = 0; i < mkeys.size(); i++) {
rm_key(omap_root, *t, mkeys[i]);
logger().debug("submitting transaction i= {}", i);
submit_transaction(std::move(t));
replay();
- t = tm->create_transaction();
+ t = create_mutate_transaction();
}
if (i % 50 == 0) {
logger().debug("check_mappings i= {}", i);
logger().debug("set big keys");
for (unsigned i = 0; i < 53; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned j = 0; j < 8; ++j) {
set_random_key(omap_root, *t);
}
logger().debug("set small keys");
for (unsigned i = 0; i < 100; i++) {
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
for (unsigned j = 0; j < 8; ++j) {
set_random_key(omap_root, *t);
}
}
auto alloc_extent(rbm_transaction &t, size_t size) {
- auto tt = tm->create_transaction(); // dummy transaction
+ auto tt = create_mutate_transaction(); // dummy transaction
auto extent = rbm_manager->find_free_block(*tt, size).unsafe_get0();
if (!extent.empty()) {
rbm_alloc_delta_t alloc_info {
}
auto get_transaction() {
- return cache.create_transaction();
+ return cache.create_transaction(Transaction::src_t::MUTATE);
}
template <typename T, typename... Args>
).safe_then(
[this] {
return seastar::do_with(
- cache.create_transaction(),
+ get_transaction(),
[this](auto &transaction) {
cache.init();
return cache.mkfs(*transaction).safe_then(
};
test_transaction_t create_transaction() {
- return { itm.create_transaction(), {} };
+ return { create_mutate_transaction(), {} };
}
- test_transaction_t create_weak_transaction() {
- return { itm.create_weak_transaction(), {} };
+ test_transaction_t create_weak_test_transaction() {
+ return { create_weak_transaction(), {} };
}
TestBlockRef alloc_extent(
}
bool check_usage() {
- auto t = create_weak_transaction();
+ auto t = create_weak_test_transaction();
SpaceTrackerIRef tracker(segment_cleaner->get_empty_space_tracker());
with_trans_intr(
*t.t,
}
void check_mappings() {
- auto t = create_weak_transaction();
+ auto t = create_weak_test_transaction();
check_mappings(t);
}
);
}
+ auto create_mutate_transaction() {
+ return tm->create_transaction(Transaction::src_t::MUTATE);
+ }
+
+ auto create_read_transaction() {
+ return tm->create_transaction(Transaction::src_t::READ);
+ }
+
+ auto create_weak_transaction() {
+ return tm->create_weak_transaction(Transaction::src_t::READ);
+ }
+
auto submit_transaction_fut(Transaction &t) {
return with_trans_intr(
t,
(is_dummy ? NodeExtentManager::create_dummy(true)
: NodeExtentManager::create_seastore(*tm)));
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->bootstrap(*t).unsafe_get();
submit_transaction(std::move(t));
}
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->insert(*t).unsafe_get();
auto start_time = mono_clock::now();
submit_transaction(std::move(t));
logger().warn("submit_transaction() done! {}s", duration.count());
}
{
- // Note: tm->create_weak_transaction() can also work, but too slow.
- auto t = tm->create_transaction();
+ // Note: create_weak_transaction() can also work, but too slow.
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get();
tree->validate(*t).unsafe_get();
}
{
- auto t = tm->create_transaction();
+ auto t = create_mutate_transaction();
tree->erase(*t, kvs.size() * erase_ratio).unsafe_get();
submit_transaction(std::move(t));
}
{
- auto t = tm->create_transaction();
+ auto t = create_read_transaction();
tree->get_stats(*t).unsafe_get();
tree->validate(*t).unsafe_get();
}