]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd/object_context_loader: clones to support ssc
authorMatan Breizman <mbreizma@redhat.com>
Wed, 3 Apr 2024 08:56:56 +0000 (08:56 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 16 May 2024 11:53:49 +0000 (14:53 +0300)
Previously, only the head obc had ssc reference. Let clone obc
also reference it's head ssc.

Fixes: https://tracker.ceph.com/issues/65203
Fixes: https://tracker.ceph.com/issues/65201
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
(cherry picked from commit 5de3da0edaeb3b415cfc9359efb06cd0d7fb58d0)

src/crimson/osd/object_context.h
src/crimson/osd/object_context_loader.cc

index f38e52f009ce44ce064b1b4179e334e9cd3e8743..22a1154809715a131587c023035f320f9d7cdeb1 100644 (file)
@@ -103,6 +103,11 @@ public:
     fully_loaded = true;
   }
 
+  void set_clone_ssc(SnapSetContextRef head_ssc) {
+    ceph_assert(!is_head());
+    ssc = head_ssc;
+  }
+
   /// pass the provided exception to any waiting consumers of this ObjectContext
   template<typename Exception>
   void interrupt(Exception ex) {
index 9772ce59776a149da76a84bee8f5243376b7fac4..b8a6cbceb296c2d0f52a023dbb9062c1a9e9df54 100644 (file)
@@ -75,6 +75,7 @@ using crimson::common::local_conf;
       auto loaded = get_or_load_obc<State>(clone, existed);
       return loaded.safe_then_interruptible(
         [func = std::move(func), head=std::move(head)](auto clone) mutable {
+        clone->set_clone_ssc(head->ssc);
         return std::move(func)(std::move(head), std::move(clone));
       });
     });
@@ -112,6 +113,7 @@ using crimson::common::local_conf;
         auto loaded = get_or_load_obc<State>(clone, existed);
         return loaded.safe_then_interruptible(
           [func = std::move(func), head=std::move(head)](auto clone) {
+          clone->set_clone_ssc(head->ssc);
           return std::move(func)(std::move(head), std::move(clone));
         });
       });
@@ -152,6 +154,9 @@ using crimson::common::local_conf;
         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));
       }
       DEBUGDPP("returning obc {} for {}", dpp, obc->obs.oi, obc->obs.oi.soid);