From: Radoslaw Zarzynski Date: Mon, 19 Jan 2026 22:29:07 +0000 (+0000) Subject: crimson/osd: make objctx loading agnostic about source of attrs X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c7d8ae0da7ebf4cd753c120ca04fdd955bb16463;p=ceph-ci.git crimson/osd: make objctx loading agnostic about source of attrs Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/object_context_loader.cc b/src/crimson/osd/object_context_loader.cc index cb763f432ba..b966da45848 100644 --- a/src/crimson/osd/object_context_loader.cc +++ b/src/crimson/osd/object_context_loader.cc @@ -183,6 +183,32 @@ ObjectContextLoader::load_obc( }); } +ObjectContextLoader::load_obc_iertr::future<> +ObjectContextLoader::load_obc( + ObjectContextRef obc, + PGBackend::loaded_object_md_t::ref md) +{ + const hobject_t& oid = md->os.oi.soid; + LOG_PREFIX(ObjectContextLoader::load_obc); + DEBUGDPP("loaded obs {} for {}", dpp, md->os.oi, oid); + if (oid.is_head()) { + if (!md->ssc) { + ERRORDPP("oid {} missing snapsetcontext", dpp, oid); + return crimson::ct_error::object_corrupted::make(); + } + obc->set_head_state(std::move(md->os), + std::move(md->ssc)); + } else { + // we load and set the ssc only for head obc. + // For clones, the head's ssc will be referenced later. + // See set_clone_ssc + obc->set_clone_state(std::move(md->os)); + } + obc->attr_cache = std::move(md->attr_cache); + DEBUGDPP("loaded obc {} for {}", dpp, obc->obs.oi, obc->obs.oi.soid); + return seastar::now(); +} + void ObjectContextLoader::notify_on_change(bool is_primary) { LOG_PREFIX(ObjectContextLoader::notify_on_change); diff --git a/src/crimson/osd/object_context_loader.h b/src/crimson/osd/object_context_loader.h index c1d27bde889..946532e6bb7 100644 --- a/src/crimson/osd/object_context_loader.h +++ b/src/crimson/osd/object_context_loader.h @@ -324,6 +324,10 @@ public: void notify_on_change(bool is_primary); + load_obc_iertr::future<> load_obc( + ObjectContextRef obc, + PGBackend::loaded_object_md_t::ref); + private: ObjectContextRegistry& obc_registry; PGBackend& backend; diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 050abd1bbf5..eab808c04a6 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -22,6 +22,7 @@ #include "crimson/common/coroutine.h" #include "crimson/common/exception.h" +#include "crimson/common/errorator-utils.h" #include "crimson/common/tmap_helpers.h" #include "crimson/os/futurized_collection.h" #include "crimson/os/futurized_store.h" @@ -90,9 +91,8 @@ PGBackend::PGBackend(pg_shard_t whoami, logger().info("initialized PGBackend::store with {}", (void*)this->store); } -PGBackend::load_metadata_iertr::future - -PGBackend::decode_metadata( +tl::expected +PGBackend::decode_metadata2( const hobject_t& oid, crimson::os::FuturizedStore::Shard::attrs_t attrs) { @@ -110,7 +110,9 @@ PGBackend::decode_metadata( logger().error( "load_metadata: object {} present but missing object info", oid); - return crimson::ct_error::object_corrupted::make(); + return tl::unexpected( + ErrorHelper::to_error( + crimson::ct_error::object_corrupted::make())); } if (oid.is_head()) { @@ -140,12 +142,13 @@ PGBackend::decode_metadata( logger().error( "load_metadata: object {} present but missing snapset", oid); - return crimson::ct_error::object_corrupted::make(); + return tl::unexpected( + ErrorHelper::to_error( + crimson::ct_error::object_corrupted::make())); } } ret->attr_cache = std::move(attrs); - return load_metadata_ertr::make_ready_future( - std::move(ret)); + return loaded_object_md_t::ref(std::move(ret)); } PGBackend::load_metadata_iertr::future @@ -155,8 +158,15 @@ PGBackend::load_metadata(const hobject_t& oid) return interruptor::make_interruptible(store->get_attrs( coll, ghobject_t{oid, ghobject_t::NO_GEN, get_shard()})).safe_then_interruptible( - [oid, this](auto &&attrs) { - return decode_metadata(oid, std::move(attrs)); + [oid, this](auto &&attrs) -> load_metadata_iertr::future { + if (auto maybe_decoded = decode_metadata2(oid, std::move(attrs)); + maybe_decoded.has_value()) { + return load_metadata_ertr::make_ready_future( + std::move(*maybe_decoded)); + } else { + return ErrorHelper\ + ::from_error(maybe_decoded.error()); + } }, 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 7934e695484..e97795024db 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -8,6 +8,7 @@ #include #include +#include "include/expected.hpp" #include "include/rados.h" #include "crimson/os/futurized_store.h" @@ -455,8 +456,9 @@ public: crimson::os::FuturizedStore::Shard::attrs_t attr_cache; using ref = std::unique_ptr; }; - load_metadata_iertr::future - decode_metadata( + + tl::expected + decode_metadata2( const hobject_t& oid, crimson::os::FuturizedStore::Shard::attrs_t attrs);