From: Yingxin Cheng Date: Wed, 7 Jul 2021 01:37:24 +0000 (+0800) Subject: crimson/os/seastore: introduce src_t to classify transactions X-Git-Tag: v17.1.0~1410^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0a68d5526654c6fd5426715ec6a67994715d2685;p=ceph.git crimson/os/seastore: introduce src_t to classify transactions * INIT - READ => INIT * INIT - MUTATE => INIT * SEASTORE/TEST - READ => READ * SEASTORE/TEST - MUTATE => MUTATE * CLEANER - READ => CLEANER * CLEANER - MUTATE => CLEANER Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index d8470838b41a..b6b0714e8905 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -94,29 +94,33 @@ public: 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( 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( 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; } diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 3cee74a7cc65..13a32dea08e0 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -83,7 +83,8 @@ seastar::future<> SeaStore::mkfs(uuid_d new_osd_fsid) 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] { @@ -130,7 +131,8 @@ SeaStore::list_objects(CollectionRef ch, [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) { @@ -172,7 +174,8 @@ seastar::future> SeaStore::list_collections() 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) { @@ -212,6 +215,7 @@ SeaStore::read_errorator::future SeaStore::read( return repeat_with_onode( ch, oid, + Transaction::src_t::READ, [=](auto &t, auto &onode) -> ObjectDataHandler::read_ret { size_t size = onode.get_layout().size; @@ -254,24 +258,27 @@ SeaStore::get_attr_errorator::future SeaStore::get_attr( LOG_PREFIX(SeaStore::get_attr); DEBUG("{} {}", c->get_cid(), oid); return repeat_with_onode( - c, oid, [=](auto &t, auto& onode) - -> _omap_get_value_ertr::future { - 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(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(std::move(bl)); + c, + oid, + Transaction::src_t::READ, + [=](auto &t, auto& onode) -> _omap_get_value_ertr::future { + 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(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(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{}); @@ -285,25 +292,29 @@ SeaStore::get_attrs_ertr::future SeaStore::get_attrs( auto c = static_cast(ch.get()); DEBUG("{} {}", c->get_cid(), oid); return repeat_with_onode( - 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(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(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{}); @@ -317,6 +328,7 @@ seastar::future SeaStore::stat( return repeat_with_onode( c, oid, + Transaction::src_t::READ, [=, &oid](auto &t, auto &onode) { struct stat st; auto &olayout = onode.get_layout(); @@ -326,11 +338,12 @@ seastar::future SeaStore::stat( st.st_nlink = 1; DEBUGT("cid {}, oid {}, return size {}", t, c->get_cid(), oid, st.st_size); return seastar::make_ready_future(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 @@ -352,6 +365,7 @@ SeaStore::omap_get_values( return repeat_with_onode( 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( @@ -468,6 +482,7 @@ SeaStore::omap_get_values_ret_t SeaStore::omap_list( return repeat_with_onode( c, oid, + Transaction::src_t::READ, [this, config, &start](auto &t, auto &onode) { return _omap_list( onode.get_layout().omap_root, @@ -617,6 +632,7 @@ seastar::future<> SeaStore::do_transaction( 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() @@ -1082,7 +1098,8 @@ seastar::future<> SeaStore::write_meta(const std::string& key, 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 @@ -1105,7 +1122,8 @@ seastar::future> SeaStore::read_meta(const std::str 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) { diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index adc67676d4e5..c7583ee05779 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -161,11 +161,12 @@ private: 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), [this](auto &ctx, auto &f) { return ctx.transaction->get_handle().take_collection_lock( @@ -188,6 +189,7 @@ private: auto repeat_with_onode( CollectionRef ch, const ghobject_t &oid, + Transaction::src_t src, F &&f) const { return seastar::do_with( oid, @@ -196,8 +198,8 @@ private: OnodeRef(), std::forward(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) { diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 3ad49b80918a..41ac9e86aba0 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -284,7 +284,7 @@ SegmentCleaner::gc_trim_journal_ret SegmentCleaner::gc_trim_journal() 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() @@ -330,7 +330,7 @@ SegmentCleaner::gc_reclaim_space_ret SegmentCleaner::gc_reclaim_space() "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( diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 256225d7f540..b656abb59494 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -246,7 +246,7 @@ public: public: virtual ~ExtentCallbackInterface() = default; - virtual TransactionRef create_transaction() = 0; + virtual TransactionRef create_transaction(Transaction::src_t) = 0; /** * get_next_dirty_extent diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index b8376d7e6d27..e8832ffc96e5 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -141,6 +141,20 @@ public: 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(src_t::MAX); + src_t get_src() const { + return src; + } + bool is_weak() const { return weak; } @@ -156,10 +170,12 @@ public: 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) {} @@ -217,14 +233,33 @@ private: 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( get_dummy_ordering_handle(), false, + Transaction::src_t::MUTATE, journal_seq_t{} ); } diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 3f00917e0716..f77fc7618857 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -36,7 +36,7 @@ TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs() 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", @@ -78,7 +78,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() }).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, diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 9bc75135e15e..5755ac3fdd10 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -107,13 +107,15 @@ public: 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 diff --git a/src/crimson/tools/store_nbd/tm_driver.cc b/src/crimson/tools/store_nbd/tm_driver.cc index 64271bc0ee20..7a02b9a0b20e 100644 --- a/src/crimson/tools/store_nbd/tm_driver.cc +++ b/src/crimson/tools/store_nbd/tm_driver.cc @@ -23,7 +23,7 @@ seastar::future<> TMDriver::write( 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( @@ -101,7 +101,7 @@ seastar::future TMDriver::read( 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 { diff --git a/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc index bdbdd3d18450..9804c9746d92 100644 --- a/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc +++ b/src/test/crimson/seastore/onode_tree/test_fltree_onode_manager.cc @@ -85,7 +85,7 @@ struct fltree_onode_manager_test_t 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] { @@ -102,7 +102,7 @@ struct fltree_onode_manager_test_t template 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(); diff --git a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc index 79ce42aed768..e77df0c6b2b7 100644 --- a/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc +++ b/src/test/crimson/seastore/onode_tree/test_staged_fltree.cc @@ -1534,7 +1534,7 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase) auto tree = std::make_unique>( 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(); @@ -1542,13 +1542,13 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase) // 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) { @@ -1558,20 +1558,20 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase) 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) { @@ -1581,19 +1581,19 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase) 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) { @@ -1603,7 +1603,7 @@ TEST_F(d_seastore_tm_test_t, 6_random_tree_insert_erase) 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); } @@ -1639,7 +1639,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) 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] { @@ -1658,7 +1658,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) 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) { @@ -1674,7 +1674,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) { 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); } @@ -1687,7 +1687,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) ++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(); @@ -1705,7 +1705,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) 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 { @@ -1721,7 +1721,7 @@ TEST_F(d_seastore_tm_test_t, 7_tree_insert_erase_eagain) { 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); diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 596e8362f6bb..57f575c17227 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -73,7 +73,7 @@ struct btree_lba_manager_test : 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 @@ -116,7 +116,7 @@ struct btree_lba_manager_test : 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(*t.t, TestBlockPhysical::SIZE); @@ -125,7 +125,7 @@ struct btree_lba_manager_test : 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; diff --git a/src/test/crimson/seastore/test_collection_manager.cc b/src/test/crimson/seastore/test_collection_manager.cc index a2ccdf2063f3..e15602c218dc 100644 --- a/src/test/crimson/seastore/test_collection_manager.cc +++ b/src/test/crimson/seastore/test_collection_manager.cc @@ -71,7 +71,7 @@ struct collection_manager_test_t : } auto get_root() { - auto tref = tm->create_transaction(); + auto tref = create_mutate_transaction(); auto coll_root = with_trans_intr( *tref, [this](auto &t) { @@ -97,7 +97,7 @@ struct collection_manager_test_t : } void checking_mappings(coll_root_t &coll_root) { - auto t = tm->create_transaction(); + auto t = create_read_transaction(); checking_mappings(coll_root, *t); } }; @@ -107,7 +107,7 @@ TEST_F(collection_manager_test_t, basic) 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)); @@ -121,7 +121,7 @@ TEST_F(collection_manager_test_t, basic) 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); @@ -131,7 +131,7 @@ TEST_F(collection_manager_test_t, basic) } 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()); @@ -145,7 +145,7 @@ TEST_F(collection_manager_test_t, overflow) 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)); @@ -165,7 +165,7 @@ TEST_F(collection_manager_test_t, update) 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)); @@ -177,7 +177,7 @@ TEST_F(collection_manager_test_t, update) 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; diff --git a/src/test/crimson/seastore/test_object_data_handler.cc b/src/test/crimson/seastore/test_object_data_handler.cc index 95770a3c5c2c..972598aa968f 100644 --- a/src/test/crimson/seastore/test_object_data_handler.cc +++ b/src/test/crimson/seastore/test_object_data_handler.cc @@ -66,7 +66,7 @@ struct object_data_handler_test_t: 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)); } @@ -88,7 +88,7 @@ struct object_data_handler_test_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)); } @@ -112,7 +112,7 @@ struct object_data_handler_test_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) { diff --git a/src/test/crimson/seastore/test_omap_manager.cc b/src/test/crimson/seastore/test_omap_manager.cc index 18889e71ccd4..47641039bc0d 100644 --- a/src/test/crimson/seastore/test_omap_manager.cc +++ b/src/test/crimson/seastore/test_omap_manager.cc @@ -194,7 +194,7 @@ struct omap_manager_test_t : } void check_mappings(omap_root_t &omap_root) { - auto t = tm->create_transaction(); + auto t = create_read_transaction(); check_mappings(omap_root, *t); } @@ -215,7 +215,7 @@ struct omap_manager_test_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) { @@ -235,14 +235,14 @@ TEST_F(omap_manager_test_t, basic) 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); @@ -250,7 +250,7 @@ TEST_F(omap_manager_test_t, basic) 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)); @@ -264,7 +264,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split) 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); @@ -285,7 +285,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge) 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); @@ -300,7 +300,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge) } } 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]); @@ -309,7 +309,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge) 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); @@ -328,7 +328,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced) 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); @@ -343,7 +343,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced) } } 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]); @@ -352,7 +352,7 @@ TEST_F(omap_manager_test_t, force_leafnode_split_merge_fullandbalanced) 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); @@ -375,7 +375,7 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear) 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); @@ -391,17 +391,17 @@ TEST_F(omap_manager_test_t, force_split_listkeys_list_clear) } { - 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)); } @@ -415,7 +415,7 @@ TEST_F(omap_manager_test_t, internal_force_split) 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); @@ -437,7 +437,7 @@ TEST_F(omap_manager_test_t, internal_force_merge_fullandbalanced) 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); @@ -449,14 +449,14 @@ TEST_F(omap_manager_test_t, internal_force_merge_fullandbalanced) 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); @@ -477,7 +477,7 @@ TEST_F(omap_manager_test_t, replay) 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); @@ -492,7 +492,7 @@ TEST_F(omap_manager_test_t, replay) 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]); @@ -500,7 +500,7 @@ TEST_F(omap_manager_test_t, replay) 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); @@ -524,7 +524,7 @@ TEST_F(omap_manager_test_t, internal_force_split_to_root) 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); @@ -534,7 +534,7 @@ TEST_F(omap_manager_test_t, internal_force_split_to_root) } 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); } diff --git a/src/test/crimson/seastore/test_randomblock_manager.cc b/src/test/crimson/seastore/test_randomblock_manager.cc index ca21453ddd1d..8065cd7b6596 100644 --- a/src/test/crimson/seastore/test_randomblock_manager.cc +++ b/src/test/crimson/seastore/test_randomblock_manager.cc @@ -103,7 +103,7 @@ struct rbm_test_t : public seastar_test_suite_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 { diff --git a/src/test/crimson/seastore/test_seastore_cache.cc b/src/test/crimson/seastore/test_seastore_cache.cc index 42d285671e96..d53e0df79040 100644 --- a/src/test/crimson/seastore/test_seastore_cache.cc +++ b/src/test/crimson/seastore/test_seastore_cache.cc @@ -62,7 +62,7 @@ struct cache_test_t : public seastar_test_suite_t { } auto get_transaction() { - return cache.create_transaction(); + return cache.create_transaction(Transaction::src_t::MUTATE); } template @@ -80,7 +80,7 @@ struct cache_test_t : public seastar_test_suite_t { ).safe_then( [this] { return seastar::do_with( - cache.create_transaction(), + get_transaction(), [this](auto &transaction) { cache.init(); return cache.mkfs(*transaction).safe_then( diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index 0325dfc32d73..db93baaeb673 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -351,11 +351,11 @@ struct transaction_manager_test_t : }; 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( @@ -386,7 +386,7 @@ struct transaction_manager_test_t : } 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, @@ -416,7 +416,7 @@ struct transaction_manager_test_t : } void check_mappings() { - auto t = create_weak_transaction(); + auto t = create_weak_test_transaction(); check_mappings(t); } diff --git a/src/test/crimson/seastore/transaction_manager_test_state.h b/src/test/crimson/seastore/transaction_manager_test_state.h index 22c9fa738e9a..ef343f5f464e 100644 --- a/src/test/crimson/seastore/transaction_manager_test_state.h +++ b/src/test/crimson/seastore/transaction_manager_test_state.h @@ -148,6 +148,18 @@ protected: ); } + 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, diff --git a/src/tools/crimson/perf_staged_fltree.cc b/src/tools/crimson/perf_staged_fltree.cc index 3f5f98fc28aa..687b0ef3928a 100644 --- a/src/tools/crimson/perf_staged_fltree.cc +++ b/src/tools/crimson/perf_staged_fltree.cc @@ -34,12 +34,12 @@ class PerfTree : public TMTestState { (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)); @@ -47,18 +47,18 @@ class PerfTree : public TMTestState { 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(); }