From: Samuel Just Date: Wed, 9 Oct 2019 22:06:55 +0000 (-0700) Subject: crimson/osd/pg_backend: factor out load_object_state/snapset X-Git-Tag: v15.1.0~687^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fd803498dffc5e2defdce17659df5a59aed80f8d;p=ceph.git crimson/osd/pg_backend: factor out load_object_state/snapset Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/cyanstore/cyan_store.cc b/src/crimson/os/cyanstore/cyan_store.cc index 6bc620430df5..0cd89953743d 100644 --- a/src/crimson/os/cyanstore/cyan_store.cc +++ b/src/crimson/os/cyanstore/cyan_store.cc @@ -217,17 +217,18 @@ CyanStore::get_attr_errorator::future CyanStore::get_attr( } } -seastar::future CyanStore::get_attrs(CollectionRef ch, - const ghobject_t& oid) +CyanStore::get_attrs_ertr::future CyanStore::get_attrs( + CollectionRef ch, + const ghobject_t& oid) { auto c = static_cast(ch.get()); logger().debug("{} {} {}", - __func__, c->get_cid(), oid); + __func__, c->get_cid(), oid); auto o = c->get_object(oid); if (!o) { - throw std::runtime_error(fmt::format("object does not exist: {}", oid)); + return crimson::ct_error::enoent::make(); } - return seastar::make_ready_future(o->xattr); + return get_attrs_ertr::make_ready_future(o->xattr); } seastar::future diff --git a/src/crimson/os/cyanstore/cyan_store.h b/src/crimson/os/cyanstore/cyan_store.h index 7fab6d643eb0..977cf2ff9293 100644 --- a/src/crimson/os/cyanstore/cyan_store.h +++ b/src/crimson/os/cyanstore/cyan_store.h @@ -54,8 +54,9 @@ public: CollectionRef c, const ghobject_t& oid, std::string_view name) const final; - seastar::future get_attrs(CollectionRef c, - const ghobject_t& oid) final; + get_attrs_ertr::future get_attrs( + CollectionRef c, + const ghobject_t& oid); seastar::future omap_get_values( CollectionRef c, diff --git a/src/crimson/os/futurized_store.h b/src/crimson/os/futurized_store.h index b7ac7d7dff7a..388b965148ee 100644 --- a/src/crimson/os/futurized_store.h +++ b/src/crimson/os/futurized_store.h @@ -58,9 +58,13 @@ public: const ghobject_t& oid, std::string_view name) const = 0; + using get_attrs_ertr = crimson::errorator< + crimson::ct_error::enoent>; using attrs_t = std::map>; - virtual seastar::future get_attrs(CollectionRef c, - const ghobject_t& oid) = 0; + virtual get_attrs_ertr::future get_attrs( + CollectionRef c, + const ghobject_t& oid) = 0; + using omap_values_t = std::map>; using omap_keys_t = std::set; virtual seastar::future omap_get_values( diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index ae81708ad2fb..a0a59b466dd8 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -17,6 +17,7 @@ #include "crimson/os/cyanstore/cyan_object.h" #include "crimson/os/futurized_collection.h" #include "crimson/os/futurized_store.h" +#include "crimson/osd/osd_operation.h" #include "replicated_backend.h" #include "ec_backend.h" #include "exceptions.h" @@ -107,29 +108,57 @@ PGBackend::get_object_state(const hobject_t& oid) } } +PGBackend::load_metadata_ertr::future +PGBackend::load_metadata(const hobject_t& oid) +{ + return store->get_attrs( + coll, + ghobject_t{oid, ghobject_t::NO_GEN, shard}).safe_then( + [oid, this](auto &&attrs) -> load_metadata_ertr::future{ + loaded_object_md_t ret; + if (auto oiiter = attrs.find(OI_ATTR); oiiter != attrs.end()) { + bufferlist bl; + bl.push_back(oiiter->second); + ret.os = ObjectState( + object_info_t(bl), + true); + } else { + return crimson::ct_error::object_corrupted::make(); + } + + if (oid.is_head()) { + if (auto ssiter = attrs.find(SS_ATTR); ssiter != attrs.end()) { + bufferlist bl; + bl.push_back(ssiter->second); + ret.ss = SnapSet(bl); + } else { + return crimson::ct_error::object_corrupted::make(); + } + } + + return load_metadata_ertr::make_ready_future( + std::move(ret)); + }, crimson::ct_error::enoent::handle([oid, this] { + return load_metadata_ertr::make_ready_future( + loaded_object_md_t{ + ObjectState(), + std::nullopt + }); + })); +} + PGBackend::get_os_errorator::future PGBackend::_load_os(const hobject_t& oid) { if (auto found = os_cache.find(oid); found) { return get_os_errorator::make_ready_future(std::move(found)); } - return store->get_attr(coll, - ghobject_t{oid, ghobject_t::NO_GEN, shard}, - OI_ATTR) - .safe_then( - [oid, this] (ceph::bufferptr&& bp) { - // decode existing OI_ATTR's value - ceph::bufferlist bl; - bl.push_back(std::move(bp)); - return get_os_errorator::make_ready_future( - os_cache.insert(oid, - std::make_unique(object_info_t{bl}, true /* exists */))); - }, crimson::errorator::all_same_way([oid, this] { - return get_os_errorator::make_ready_future( - os_cache.insert(oid, - std::make_unique(object_info_t{oid}, false))); - })); + return load_metadata(oid).safe_then([oid, this](auto &&md) { + return get_os_errorator::make_ready_future( + os_cache.insert( + oid, + std::make_unique(std::move(md.os)))); + }); } PGBackend::get_os_errorator::future @@ -138,25 +167,15 @@ PGBackend::_load_ss(const hobject_t& oid) if (auto found = ss_cache.find(oid); found) { return get_os_errorator::make_ready_future(std::move(found)); } - return store->get_attr(coll, - ghobject_t{oid, ghobject_t::NO_GEN, shard}, - SS_ATTR) - .safe_then( - [oid, this] (ceph::bufferptr&& bp) { - // decode existing SS_ATTR's value - ceph::bufferlist bl; - bl.push_back(std::move(bp)); + return load_metadata(oid).safe_then([oid, this](auto &&md) { + if (!md.ss) { return get_os_errorator::make_ready_future( - ss_cache.insert(oid, std::make_unique(bl))); - }, crimson::errorator::all_same_way([oid, this] { - // NOTE: the errors could have been handled by writing just: - // `get_attr_errorator::all_same_way(...)`. - // however, this way is more explicit and resilient to unexpected - // changes in the alias definition. + std::make_unique()); + } else { return get_os_errorator::make_ready_future( - ss_cache.insert(oid, std::make_unique())); - })); + ss_cache.insert(oid, std::make_unique(std::move(*(md.ss))))); + } + }); } seastar::future diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index d355ab02598e..b2ba4fd2c7b4 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -123,17 +123,30 @@ protected: CollectionRef coll; crimson::os::FuturizedStore* store; +public: + using load_metadata_ertr = crimson::errorator< + crimson::ct_error::object_corrupted>; + struct loaded_object_md_t { + ObjectState os; + std::optional ss; + }; + load_metadata_ertr::future load_metadata( + const hobject_t &oid); + private: using cached_ss_t = boost::local_shared_ptr; SharedLRU ss_cache; get_os_errorator::future _load_ss(const hobject_t& oid); + SharedLRU os_cache; get_os_errorator::future _load_os(const hobject_t& oid); + virtual ll_read_errorator::future _read( const hobject_t& hoid, size_t offset, size_t length, uint32_t flags) = 0; + bool maybe_create_new_object(ObjectState& os, ceph::os::Transaction& txn); virtual seastar::future _submit_transaction(std::set&& pg_shards,