From fbc03ce4ec06a6eeab31f0c6ba058795231539c4 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Wed, 3 Apr 2024 08:56:56 +0000 Subject: [PATCH] crimson/osd/object_context_loader: clones to support ssc 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 (cherry picked from commit 5de3da0edaeb3b415cfc9359efb06cd0d7fb58d0) --- src/crimson/osd/object_context.h | 5 +++++ src/crimson/osd/object_context_loader.cc | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/crimson/osd/object_context.h b/src/crimson/osd/object_context.h index f38e52f009ce4..22a1154809715 100644 --- a/src/crimson/osd/object_context.h +++ b/src/crimson/osd/object_context.h @@ -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 void interrupt(Exception ex) { diff --git a/src/crimson/osd/object_context_loader.cc b/src/crimson/osd/object_context_loader.cc index 9772ce59776a1..b8a6cbceb296c 100644 --- a/src/crimson/osd/object_context_loader.cc +++ b/src/crimson/osd/object_context_loader.cc @@ -75,6 +75,7 @@ using crimson::common::local_conf; auto loaded = get_or_load_obc(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(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); -- 2.39.5