From: Radoslaw Zarzynski Date: Thu, 9 May 2024 10:20:33 +0000 (+0000) Subject: crimson/osd: dissect metadata decoding from PGBackend::load_metadata() X-Git-Tag: v21.0.0~3^2~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c65c06d245785f5fd2a90e3d594b22c5b45fbe38;p=ceph.git crimson/osd: dissect metadata decoding from PGBackend::load_metadata() This loosens the coupling between loading and decoding making the latter reusable with metadata coming from other source than local object store. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index ef42af785dcf..e6ac13f54987 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -91,6 +91,64 @@ PGBackend::PGBackend(pg_shard_t whoami, logger().info("initialized PGBackend::store with {}", (void*)this->store); } +PGBackend::load_metadata_iertr::future + +PGBackend::decode_metadata( + const hobject_t& oid, + crimson::os::FuturizedStore::Shard::attrs_t attrs) +{ + loaded_object_md_t::ref ret(new loaded_object_md_t()); + if (auto oiiter = attrs.find(OI_ATTR); oiiter != attrs.end()) { + bufferlist bl = std::move(oiiter->second); + try { + ret->os = ObjectState(object_info_t(bl), true); + ceph_assert(oid == ret->os.oi.soid); + } catch (const buffer::error&) { + logger().warn("unable to decode ObjectState"); + throw crimson::osd::invalid_argument(); + } + } else { + logger().error( + "load_metadata: object {} present but missing object info", + oid); + return crimson::ct_error::object_corrupted::make(); + } + + if (oid.is_head()) { + // Returning object_corrupted when the object exsits and the + // Snapset is either not found or empty. + bool object_corrupted = true; + if (auto ssiter = attrs.find(SS_ATTR); ssiter != attrs.end()) { + object_corrupted = false; + bufferlist bl = std::move(ssiter->second); + if (bl.length()) { + ret->ssc = new crimson::osd::SnapSetContext(oid.get_snapdir()); + try { + ret->ssc->snapset = SnapSet(bl); + ret->ssc->exists = true; + logger().debug( + "load_metadata: object {} and snapset {} present", + oid, ret->ssc->snapset); + } catch (const buffer::error&) { + logger().warn("unable to decode SnapSet"); + throw crimson::osd::invalid_argument(); + } + } else { + object_corrupted = true; + } + } + if (object_corrupted) { + logger().error( + "load_metadata: object {} present but missing snapset", + oid); + return crimson::ct_error::object_corrupted::make(); + } + } + ret->attr_cache = std::move(attrs); + return load_metadata_ertr::make_ready_future( + std::move(ret)); +} + PGBackend::load_metadata_iertr::future PGBackend::load_metadata(const hobject_t& oid) @@ -100,57 +158,8 @@ PGBackend::load_metadata(const hobject_t& oid) store, coll, ghobject_t{oid, ghobject_t::NO_GEN, get_shard()}, 0)).safe_then_interruptible( - [oid](auto &&attrs) -> load_metadata_ertr::future{ - loaded_object_md_t::ref ret(new loaded_object_md_t()); - if (auto oiiter = attrs.find(OI_ATTR); oiiter != attrs.end()) { - bufferlist bl = std::move(oiiter->second); - try { - ret->os = ObjectState(object_info_t(bl), true); - ceph_assert(oid == ret->os.oi.soid); - } catch (const buffer::error&) { - logger().warn("unable to decode ObjectState"); - throw crimson::osd::invalid_argument(); - } - } else { - logger().error( - "load_metadata: object {} present but missing object info", - oid); - return crimson::ct_error::object_corrupted::make(); - } - - if (oid.is_head()) { - // Returning object_corrupted when the object exsits and the - // Snapset is either not found or empty. - bool object_corrupted = true; - if (auto ssiter = attrs.find(SS_ATTR); ssiter != attrs.end()) { - object_corrupted = false; - bufferlist bl = std::move(ssiter->second); - if (bl.length()) { - ret->ssc = new crimson::osd::SnapSetContext(oid.get_snapdir()); - try { - ret->ssc->snapset = SnapSet(bl); - ret->ssc->exists = true; - logger().debug( - "load_metadata: object {} and snapset {} present", - oid, ret->ssc->snapset); - } catch (const buffer::error&) { - logger().warn("unable to decode SnapSet"); - throw crimson::osd::invalid_argument(); - } - } else { - object_corrupted = true; - } - } - if (object_corrupted) { - logger().error( - "load_metadata: object {} present but missing snapset", - oid); - return crimson::ct_error::object_corrupted::make(); - } - } - ret->attr_cache = std::move(attrs); - return load_metadata_ertr::make_ready_future( - std::move(ret)); + [oid, this](auto &&attrs) { + return decode_metadata(oid, std::move(attrs)); }, crimson::ct_error::enoent::handle([oid] { logger().debug( "load_metadata: object {} doesn't exist, returning empty metadata", diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index d0264e415aff..518a949a14f7 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -456,6 +456,11 @@ public: crimson::os::FuturizedStore::Shard::attrs_t attr_cache; using ref = std::unique_ptr; }; + load_metadata_iertr::future + decode_metadata( + const hobject_t& oid, + crimson::os::FuturizedStore::Shard::attrs_t attrs); + load_metadata_iertr::future load_metadata( const hobject_t &oid);