]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: dissect metadata decoding from PGBackend::load_metadata()
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 9 May 2024 10:20:33 +0000 (10:20 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 14:47:44 +0000 (14:47 +0000)
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 <rzarzyns@redhat.com>
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index d61454dc11ec7ce1c0e409b712720bba954c6177..050abd1bbf5e1815602884070236aac03bc9e9e7 100644 (file)
@@ -90,6 +90,64 @@ 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(
+  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<loaded_object_md_t::ref>(
+    std::move(ret));
+}
+
 PGBackend::load_metadata_iertr::future
   <PGBackend::loaded_object_md_t::ref>
 PGBackend::load_metadata(const hobject_t& oid)
@@ -97,57 +155,8 @@ 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](auto &&attrs) -> load_metadata_ertr::future<loaded_object_md_t::ref>{
-        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<loaded_object_md_t::ref>(
-          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",
index 3eac0b4725348cb5cd20249ccc9163e0d79366ce..7934e6954849197b4af580590ad856058ff71c16 100644 (file)
@@ -455,6 +455,11 @@ 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(
+    const hobject_t& oid,
+    crimson::os::FuturizedStore::Shard::attrs_t attrs);
+
   load_metadata_iertr::future<loaded_object_md_t::ref>
   load_metadata(
     const hobject_t &oid);