]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: make objctx loading agnostic about source of attrs
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 19 Jan 2026 22:29:07 +0000 (22:29 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 19:42:59 +0000 (19:42 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/object_context_loader.cc
src/crimson/osd/object_context_loader.h
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index cb763f432ba36da1cb0ba600e76d9f90dd4ad6b8..b966da45848b466a42cded4624d09171edc22a77 100644 (file)
@@ -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);
index c1d27bde8897fa3ade8117c7000d63b747ad1e1d..946532e6bb7dbfa5cd6771b6eb39e07de388386f 100644 (file)
@@ -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;
index 050abd1bbf5e1815602884070236aac03bc9e9e7..eab808c04a6f8cb6b880b75d89b793efc6df822e 100644 (file)
@@ -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::loaded_object_md_t::ref>
-PGBackend::decode_metadata(
+tl::expected<PGBackend::loaded_object_md_t::ref, std::error_code>
+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<load_metadata_ertr>::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<load_metadata_ertr>::to_error(
+          crimson::ct_error::object_corrupted::make()));
     }
   }
   ret->attr_cache = std::move(attrs);
-  return load_metadata_ertr::make_ready_future<loaded_object_md_t::ref>(
-    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<PGBackend::loaded_object_md_t::ref> {
+        if (auto maybe_decoded = decode_metadata2(oid, std::move(attrs));
+            maybe_decoded.has_value()) {
+          return load_metadata_ertr::make_ready_future<loaded_object_md_t::ref>(
+            std::move(*maybe_decoded));
+        } else {
+          return ErrorHelper<load_metadata_ertr>\
+           ::from_error<PGBackend::loaded_object_md_t::ref>(maybe_decoded.error());
+        }
       }, crimson::ct_error::enoent::handle([oid] {
         logger().debug(
           "load_metadata: object {} doesn't exist, returning empty metadata",
index 7934e6954849197b4af580590ad856058ff71c16..e97795024dba3c36e52dc0e0ce3fce5a8e2060a5 100644 (file)
@@ -8,6 +8,7 @@
 #include <string>
 #include <boost/container/flat_set.hpp>
 
+#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<loaded_object_md_t>;
   };
-  load_metadata_iertr::future<loaded_object_md_t::ref>
-  decode_metadata(
+
+  tl::expected<typename loaded_object_md_t::ref, std::error_code>
+  decode_metadata2(
     const hobject_t& oid,
     crimson::os::FuturizedStore::Shard::attrs_t attrs);