From: Yingxin Cheng Date: Fri, 6 Sep 2024 08:54:22 +0000 (+0800) Subject: crimson/os/seastore: misc cleanups X-Git-Tag: v20.0.0~873^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fc537c8d914274791ec179bf08a95dc558d81266;p=ceph.git crimson/os/seastore: misc cleanups Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/futurized_store.h b/src/crimson/os/futurized_store.h index fe09cc545107..0dca695ba3a1 100644 --- a/src/crimson/os/futurized_store.h +++ b/src/crimson/os/futurized_store.h @@ -75,14 +75,15 @@ public: CollectionRef c, const ghobject_t& oid) = 0; - using omap_values_t = std::map>; + using omap_values_t = attrs_t; using omap_keys_t = std::set; virtual read_errorator::future omap_get_values( CollectionRef c, const ghobject_t& oid, const omap_keys_t& keys) = 0; - virtual read_errorator::future> omap_get_values( + using omap_values_paged_t = std::tuple; + virtual read_errorator::future omap_get_values( CollectionRef c, ///< [in] collection const ghobject_t &oid, ///< [in] oid const std::optional &start ///< [in] start, empty for begin @@ -147,7 +148,8 @@ public: return seastar::now(); } - virtual read_errorator::future> fiemap( + using fiemap_ret_t = std::map; + virtual read_errorator::future fiemap( CollectionRef ch, const ghobject_t& oid, uint64_t off, diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 157743323735..d708231b47b1 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -30,8 +30,6 @@ #include "crimson/os/seastore/onode_manager.h" #include "crimson/os/seastore/object_data_handler.h" - -using std::string; using crimson::common::local_conf; template <> struct fmt::formatter @@ -278,10 +276,10 @@ SeaStore::mount_ertr::future<> SeaStore::mount() return set_secondaries(); }); }); - }).safe_then([this] { - return shard_stores.invoke_on_all([](auto &local_store) { - return local_store.mount_managers(); - }); + }); + }).safe_then([this] { + return shard_stores.invoke_on_all([](auto &local_store) { + return local_store.mount_managers(); }); }).handle_error( crimson::ct_error::assert_all{ @@ -345,15 +343,15 @@ seastar::future<> SeaStore::write_fsid(uuid_d new_osd_fsid) auto [ret, fsid] = tuple; std::string str_fsid = stringify(new_osd_fsid); if (ret == -1) { - return write_meta("fsid", stringify(new_osd_fsid)); + return write_meta("fsid", stringify(new_osd_fsid)); } else if (ret == 0 && fsid != str_fsid) { - ERROR("on-disk fsid {} != provided {}", - fsid, stringify(new_osd_fsid)); - throw std::runtime_error("store fsid error"); - } else { + ERROR("on-disk fsid {} != provided {}", + fsid, stringify(new_osd_fsid)); + throw std::runtime_error("store fsid error"); + } else { return seastar::now(); - } - }); + } + }); } seastar::future<> @@ -413,7 +411,8 @@ seastar::future<> SeaStore::set_secondaries() SeaStore::mkfs_ertr::future<> SeaStore::test_mkfs(uuid_d new_osd_fsid) { ceph_assert(seastar::this_shard_id() == primary_core); - return read_meta("mkfs_done").then([this, new_osd_fsid] (auto tuple) { + return read_meta("mkfs_done" + ).then([this, new_osd_fsid](auto tuple) { auto [done, value] = tuple; if (done == 0) { return seastar::now(); @@ -449,7 +448,8 @@ seastar::future<> SeaStore::prepare_meta(uuid_d new_osd_fsid) SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) { ceph_assert(seastar::this_shard_id() == primary_core); - return read_meta("mkfs_done").then([this, new_osd_fsid] (auto tuple) { + return read_meta("mkfs_done" + ).then([this, new_osd_fsid](auto tuple) { auto [done, value] = tuple; if (done == 0) { return seastar::now(); @@ -542,7 +542,7 @@ SeaStore::mkfs_ertr::future<> SeaStore::mkfs(uuid_d new_osd_fsid) }); } -using coll_core_t = FuturizedStore::coll_core_t; +using coll_core_t = SeaStore::coll_core_t; seastar::future> SeaStore::list_collections() { @@ -566,9 +566,10 @@ store_statfs_t SeaStore::Shard::stat() const seastar::future SeaStore::stat() const { - ceph_assert(seastar::this_shard_id() == primary_core); LOG_PREFIX(SeaStore::stat); DEBUG(""); + + ceph_assert(seastar::this_shard_id() == primary_core); return shard_stores.map_reduce0( [](const SeaStore::Shard &local_store) { return local_store.stat(); @@ -914,10 +915,11 @@ SeaStore::Shard::list_objects(CollectionRef ch, seastar::stop_iteration >(seastar::stop_iteration::no); }); - }).si_then([&ret] { - return list_iertr::make_ready_future< - OnodeManager::list_onodes_bare_ret>(std::move(ret)); - }); + } + ).si_then([&ret] { + return list_iertr::make_ready_future< + OnodeManager::list_onodes_bare_ret>(std::move(ret)); + }); } }); }).safe_then([&ret](auto&& _ret) { @@ -949,7 +951,8 @@ SeaStore::Shard::open_collection(const coll_t& cid) { LOG_PREFIX(SeaStore::open_collection); DEBUG("{}", cid); - return list_collections().then([cid, this] (auto colls_cores) { + return list_collections( + ).then([cid, this] (auto colls_cores) { if (auto found = std::find(colls_cores.begin(), colls_cores.end(), std::make_pair(cid, seastar::this_shard_id())); @@ -1032,7 +1035,7 @@ SeaStore::Shard::read( Transaction::src_t::READ, "read_obj", op_type_t::READ, - [=, this](auto &t, auto &onode) -> ObjectDataHandler::read_ret { + [this, offset, len, op_flags](auto &t, auto &onode) -> ObjectDataHandler::read_ret { size_t size = onode.get_layout().size; if (offset >= size) { @@ -1098,10 +1101,10 @@ SeaStore::Shard::readv( return seastar::do_with( _oid, ceph::bufferlist{}, - [=, this, &m](auto &oid, auto &ret) { + [ch, op_flags, this, &m](auto &oid, auto &ret) { return crimson::do_for_each( m, - [=, this, &oid, &ret](auto &p) { + [ch, op_flags, this, &oid, &ret](auto &p) { return read( ch, oid, p.first, p.second, op_flags ).safe_then([&ret](auto bl) { @@ -1112,7 +1115,6 @@ SeaStore::Shard::readv( (std::move(ret)); }); }); - return read_errorator::make_ready_future(); } using crimson::os::seastore::omap_manager::BtreeOMapManager; @@ -1123,20 +1125,19 @@ SeaStore::Shard::get_attr( const ghobject_t& oid, std::string_view name) const { - auto c = static_cast(ch.get()); LOG_PREFIX(SeaStore::get_attr); - DEBUG("{} {}", c->get_cid(), oid); + DEBUG("{} {}", ch->get_cid(), oid); ++(shard_stats.read_num); ++(shard_stats.pending_read_num); return repeat_with_onode( - c, + ch, oid, Transaction::src_t::READ, "get_attr", op_type_t::GET_ATTR, - [=, this](auto &t, auto& onode) -> _omap_get_value_ret { + [this, name](auto &t, auto& onode) -> _omap_get_value_ret { auto& layout = onode.get_layout(); if (name == OI_ATTR && layout.oi_size) { ceph::bufferlist bl; @@ -1170,19 +1171,18 @@ SeaStore::Shard::get_attrs( const ghobject_t& oid) { LOG_PREFIX(SeaStore::get_attrs); - auto c = static_cast(ch.get()); - DEBUG("{} {}", c->get_cid(), oid); + DEBUG("{} {}", ch->get_cid(), oid); ++(shard_stats.read_num); ++(shard_stats.pending_read_num); return repeat_with_onode( - c, + ch, oid, Transaction::src_t::READ, "get_addrs", op_type_t::GET_ATTRS, - [=, this](auto &t, auto& onode) { + [this](auto &t, auto& onode) { auto& layout = onode.get_layout(); return omap_list(onode, layout.xattr_root, t, std::nullopt, OMapManager::omap_list_config_t() @@ -1202,7 +1202,7 @@ SeaStore::Shard::get_attrs( attrs.emplace(SS_ATTR, std::move(bl)); DEBUGT("set ss from onode layout", t); } - return seastar::make_ready_future(std::move(attrs)); + return seastar::make_ready_future(std::move(attrs)); }); } ).handle_error( @@ -1229,7 +1229,7 @@ seastar::future SeaStore::Shard::stat( Transaction::src_t::READ, "stat", op_type_t::STAT, - [=, this](auto &t, auto &onode) { + [this, oid](auto &t, auto &onode) { struct stat st; auto &olayout = onode.get_layout(); st.st_size = olayout.size; @@ -1266,9 +1266,8 @@ SeaStore::Shard::omap_get_values( ++(shard_stats.read_num); ++(shard_stats.pending_read_num); - auto c = static_cast(ch.get()); return repeat_with_onode( - c, + ch, oid, Transaction::src_t::READ, "omap_get_values", @@ -1298,21 +1297,20 @@ SeaStore::Shard::_omap_get_value( std::move(root), std::string(key), [&t](auto &manager, auto& root, auto& key) -> _omap_get_value_ret { - if (root.is_null()) { + if (root.is_null()) { + return crimson::ct_error::enodata::make(); + } + return manager.omap_get_value(root, t, key + ).si_then([](auto opt) -> _omap_get_value_ret { + if (!opt) { return crimson::ct_error::enodata::make(); } - return manager.omap_get_value(root, t, key - ).si_then([](auto opt) -> _omap_get_value_ret { - if (!opt) { - return crimson::ct_error::enodata::make(); - } - return seastar::make_ready_future(std::move(*opt)); - }); - } - ); + return seastar::make_ready_future(std::move(*opt)); + }); + }); } -SeaStore::Shard::_omap_get_values_ret +SeaStore::base_iertr::future SeaStore::Shard::_omap_get_values( Transaction &t, omap_root_t &&omap_root, @@ -1325,31 +1323,29 @@ SeaStore::Shard::_omap_get_values( BtreeOMapManager(*transaction_manager), std::move(omap_root), omap_values_t(), - [&](auto &manager, auto &root, auto &ret) { - return trans_intr::do_for_each( - keys.begin(), - keys.end(), - [&](auto &key) { - return manager.omap_get_value( - root, - t, - key - ).si_then([&ret, &key](auto &&p) { - if (p) { - bufferlist bl; - bl.append(*p); - ret.emplace( - std::move(key), - std::move(bl)); - } - return seastar::now(); - }); + [&t, &keys](auto &manager, auto &root, auto &ret) { + return trans_intr::do_for_each( + keys.begin(), + keys.end(), + [&t, &manager, &root, &ret](auto &key) { + return manager.omap_get_value( + root, + t, + key + ).si_then([&ret, &key](auto &&p) { + if (p) { + bufferlist bl; + bl.append(*p); + ret.emplace( + std::move(key), + std::move(bl)); } - ).si_then([&ret] { - return std::move(ret); + return seastar::now(); }); - } - ); + }).si_then([&ret] { + return std::move(ret); + }); + }); } SeaStore::Shard::omap_list_ret @@ -1377,22 +1373,20 @@ SeaStore::Shard::omap_list( }); } -SeaStore::Shard::omap_get_values_ret_t +SeaStore::Shard::read_errorator::future SeaStore::Shard::omap_get_values( CollectionRef ch, const ghobject_t &oid, - const std::optional &start) + const std::optional &start) { - auto c = static_cast(ch.get()); LOG_PREFIX(SeaStore::omap_get_values); - DEBUG("{} {}", c->get_cid(), oid); + DEBUG("{} {}", ch->get_cid(), oid); ++(shard_stats.read_num); ++(shard_stats.pending_read_num); - using ret_bare_t = std::tuple; - return repeat_with_onode( - c, + return repeat_with_onode( + ch, oid, Transaction::src_t::READ, "omap_list", @@ -1413,7 +1407,8 @@ SeaStore::Shard::omap_get_values( }); } -SeaStore::Shard::_fiemap_ret SeaStore::Shard::_fiemap( +SeaStore::base_iertr::future +SeaStore::Shard::_fiemap( Transaction &t, Onode &onode, uint64_t off, @@ -1421,7 +1416,7 @@ SeaStore::Shard::_fiemap_ret SeaStore::Shard::_fiemap( { return seastar::do_with( ObjectDataHandler(max_object_size), - [=, this, &t, &onode] (auto &objhandler) { + [this, off, len, &t, &onode](auto &objhandler) { return objhandler.fiemap( ObjectDataHandler::context_t{ *transaction_manager, @@ -1433,7 +1428,7 @@ SeaStore::Shard::_fiemap_ret SeaStore::Shard::_fiemap( }); } -SeaStore::Shard::read_errorator::future> +SeaStore::Shard::read_errorator::future SeaStore::Shard::fiemap( CollectionRef ch, const ghobject_t& oid, @@ -1446,13 +1441,13 @@ SeaStore::Shard::fiemap( ++(shard_stats.read_num); ++(shard_stats.pending_read_num); - return repeat_with_onode>( + return repeat_with_onode( ch, oid, Transaction::src_t::READ, "fiemap_read", op_type_t::READ, - [=, this](auto &t, auto &onode) -> _fiemap_ret { + [this, off, len](auto &t, auto &onode) -> base_iertr::future { size_t size = onode.get_layout().size; if (off >= size) { INFOT("fiemap offset is over onode size!", t); @@ -1497,7 +1492,7 @@ seastar::future<> SeaStore::Shard::do_transaction_no_callbacks( "do_transaction", op_type_t::TRANSACTION, [this](auto &ctx) { - return with_trans_intr(*ctx.transaction, [&, this](auto &t) { + return with_trans_intr(*ctx.transaction, [&ctx, this](auto &t) { LOG_PREFIX(SeaStore::Shard::do_transaction_no_callbacks); SUBDEBUGT(seastore_t, "start with {} objects", t, ctx.iter.objects.size()); @@ -1578,8 +1573,9 @@ SeaStore::Shard::_do_transaction_step( SUBTRACET(seastore_t, "got op {}", *ctx.transaction, (uint32_t)op->op); using ceph::os::Transaction; - if (op->op == Transaction::OP_NOP) + if (op->op == Transaction::OP_NOP) { return tm_iertr::now(); + } switch (op->op) { case Transaction::OP_RMCOLL: @@ -1611,14 +1607,14 @@ SeaStore::Shard::_do_transaction_step( create = true; } if (!onodes[op->oid]) { + const ghobject_t& oid = i.get_oid(op->oid); if (!create) { - fut = onode_manager->get_onode(*ctx.transaction, i.get_oid(op->oid)); + fut = onode_manager->get_onode(*ctx.transaction, oid); } else { - fut = onode_manager->get_or_create_onode( - *ctx.transaction, i.get_oid(op->oid)); + fut = onode_manager->get_or_create_onode(*ctx.transaction, oid); } } - return fut.si_then([&, op](auto get_onode) { + return fut.si_then([&, op, this](auto get_onode) { OnodeRef &o = onodes[op->oid]; if (!o) { assert(get_onode); @@ -1632,7 +1628,7 @@ SeaStore::Shard::_do_transaction_step( // support parallel extents loading return onode_manager->get_or_create_onode( *ctx.transaction, i.get_oid(op->dest_oid) - ).si_then([&, op](auto dest_onode) { + ).si_then([&onodes, &d_onodes, op](auto dest_onode) { assert(dest_onode); auto &d_o = onodes[op->dest_oid]; assert(!d_o); @@ -1644,7 +1640,7 @@ SeaStore::Shard::_do_transaction_step( } else { return OnodeManager::get_or_create_onode_iertr::now(); } - }).si_then([&, op, this]() -> tm_ret { + }).si_then([&ctx, &i, &onodes, &d_onodes, op, this, FNAME]() -> tm_ret { LOG_PREFIX(SeaStore::_do_transaction_step); try { switch (op->op) { @@ -2126,8 +2122,8 @@ SeaStore::Shard::_omap_clear( { LOG_PREFIX(SeaStore::_omap_clear); DEBUGT("{} {} keys", *ctx.transaction, *onode); - return _xattr_rmattr(ctx, onode, std::string(OMAP_HEADER_XATTR_KEY)) - .si_then([this, &ctx, &onode]() -> tm_ret { + return _xattr_rmattr(ctx, onode, std::string(OMAP_HEADER_XATTR_KEY) + ).si_then([this, &ctx, &onode]() -> tm_ret { if (auto omap_root = onode->get_layout().omap_root.get( onode->get_metadata_hint(device->get_block_size())); omap_root.is_null()) { @@ -2142,8 +2138,8 @@ SeaStore::Shard::_omap_clear( auto &omap_root) { return omap_manager.omap_clear( omap_root, - *ctx.transaction) - .si_then([&] { + *ctx.transaction + ).si_then([&] { if (omap_root.must_update()) { onode->update_omap_root(*ctx.transaction, omap_root); } @@ -2489,6 +2485,21 @@ SeaStore::Shard::_get_collection(const coll_t& cid) return new SeastoreCollection{cid}; } +seastar::future<> SeaStore::write_meta( + const std::string& key, + const std::string& value) { + ceph_assert(seastar::this_shard_id() == primary_core); + return seastar::do_with(key, value, + [this](auto& key, auto& value) { + return shard_stores.local().write_meta(key, value + ).then([this, &key, &value] { + return mdstore->write_meta(key, value); + }).handle_error( + crimson::ct_error::assert_all{"Invalid error in SeaStore::write_meta"} + ); + }); +} + seastar::future<> SeaStore::Shard::write_meta( const std::string& key, const std::string& value) @@ -2501,27 +2512,22 @@ seastar::future<> SeaStore::Shard::write_meta( // For TM::submit_transaction() ++(shard_stats.processing_inlock_io_num); - return seastar::do_with( - key, value, - [this, FNAME](auto& key, auto& value) { - return repeat_eagain([this, FNAME, &key, &value] { - ++(shard_stats.repeat_io_num); - - return transaction_manager->with_transaction_intr( - Transaction::src_t::MUTATE, - "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); - }); - }); - }); - } - ).handle_error( + return repeat_eagain([this, FNAME, &key, &value] { + ++(shard_stats.repeat_io_num); + + return transaction_manager->with_transaction_intr( + Transaction::src_t::MUTATE, + "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); + }); + }); + }).handle_error( crimson::ct_error::assert_all{"Invalid error in SeaStore::write_meta"} ).finally([this] { assert(shard_stats.pending_io_num); @@ -2535,10 +2541,11 @@ seastar::future<> SeaStore::Shard::write_meta( seastar::future> SeaStore::read_meta(const std::string& key) { - ceph_assert(seastar::this_shard_id() == primary_core); LOG_PREFIX(SeaStore::read_meta); DEBUG("key: {}", key); - return mdstore->read_meta(key).safe_then([](auto v) { + ceph_assert(seastar::this_shard_id() == primary_core); + return mdstore->read_meta(key + ).safe_then([](auto v) { if (v) { return std::make_tuple(0, std::move(*v)); } else { diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index fb495a422f65..58d4f5e593cb 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -71,20 +71,19 @@ struct col_obj_ranges_t { class SeaStore final : public FuturizedStore { public: + using base_ertr = TransactionManager::base_ertr; + using base_iertr = TransactionManager::base_iertr; + class MDStore { public: - using base_iertr = crimson::errorator< - crimson::ct_error::input_output_error - >; - - using write_meta_ertr = base_iertr; + using write_meta_ertr = base_ertr; using write_meta_ret = write_meta_ertr::future<>; virtual write_meta_ret write_meta( const std::string &key, const std::string &val ) = 0; - using read_meta_ertr = base_iertr; + using read_meta_ertr = base_ertr; using read_meta_ret = write_meta_ertr::future>; virtual read_meta_ret read_meta(const std::string &key) = 0; @@ -136,10 +135,7 @@ public: const omap_keys_t& keys) final; /// Retrieves paged set of values > start (if present) - using omap_get_values_ret_bare_t = std::tuple; - using omap_get_values_ret_t = read_errorator::future< - omap_get_values_ret_bare_t>; - omap_get_values_ret_t omap_get_values( + read_errorator::future omap_get_values( CollectionRef c, ///< [in] collection const ghobject_t &oid, ///< [in] oid const std::optional &start ///< [in] start, empty for begin @@ -170,7 +166,7 @@ public: * stages and locks as do_transaction. */ seastar::future<> flush(CollectionRef ch) final; - read_errorator::future> fiemap( + read_errorator::future fiemap( CollectionRef ch, const ghobject_t& oid, uint64_t off, @@ -190,7 +186,6 @@ public: secondaries.emplace_back(&sec_dev); } - using coll_core_t = FuturizedStore::coll_core_t; seastar::future> list_collections(); seastar::future<> write_meta(const std::string& key, @@ -334,14 +329,16 @@ public: }); } - using _fiemap_ret = ObjectDataHandler::fiemap_ret; - _fiemap_ret _fiemap( - Transaction &t, - Onode &onode, - uint64_t off, - uint64_t len) const; + using omap_list_bare_ret = OMapManager::omap_list_bare_ret; + using omap_list_ret = OMapManager::omap_list_ret; + omap_list_ret omap_list( + Onode& onode, + const omap_root_le_t& omap_root, + Transaction& t, + const std::optional& start, + OMapManager::omap_list_config_t config) const; - using _omap_get_value_iertr = OMapManager::base_iertr::extend< + using _omap_get_value_iertr = base_iertr::extend< crimson::ct_error::enodata >; using _omap_get_value_ret = _omap_get_value_iertr::future; @@ -350,25 +347,20 @@ public: omap_root_t &&root, std::string_view key) const; - using _omap_get_values_iertr = OMapManager::base_iertr; - using _omap_get_values_ret = _omap_get_values_iertr::future; - _omap_get_values_ret _omap_get_values( + base_iertr::future _omap_get_values( Transaction &t, omap_root_t &&root, const omap_keys_t &keys) const; friend class SeaStoreOmapIterator; - using omap_list_bare_ret = OMapManager::omap_list_bare_ret; - using omap_list_ret = OMapManager::omap_list_ret; - omap_list_ret omap_list( + base_iertr::future _fiemap( + Transaction &t, Onode &onode, - const omap_root_le_t& omap_root, - Transaction& t, - const std::optional& start, - OMapManager::omap_list_config_t config) const; + uint64_t off, + uint64_t len) const; - using tm_iertr = TransactionManager::base_iertr; + using tm_iertr = base_iertr; using tm_ret = tm_iertr::future<>; tm_ret _do_transaction_step( internal_context_t &ctx, @@ -535,17 +527,7 @@ public: return shard_stores.local().get_fsid(); } - seastar::future<> write_meta( - const std::string& key, - const std::string& value) final { - ceph_assert(seastar::this_shard_id() == primary_core); - return shard_stores.local().write_meta( - key, value).then([this, key, value] { - return mdstore->write_meta(key, value); - }).handle_error( - crimson::ct_error::assert_all{"Invalid error in SeaStore::write_meta"} - ); - } + seastar::future<> write_meta(const std::string& key, const std::string& value) final; seastar::future> read_meta(const std::string& key) final;