]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson: remove watchers upon object deletion
authorSamuel Just <sjust@redhat.com>
Tue, 15 Oct 2024 02:42:59 +0000 (19:42 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 15 Oct 2024 03:37:26 +0000 (20:37 -0700)
Fixes: https://tracker.ceph.com/issues/68538
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/osd/ops_executer.cc

index df4f73d4077d19b60a54305d12bab81e69dc2204..4464466eff0d76781158ef65864043700da78d02 100644 (file)
@@ -678,16 +678,32 @@ OpsExecuter::do_execute_op(OSDOp& osd_op)
       whiteout = true;
     }
     return do_write_op([this, whiteout](auto& backend, auto& os, auto& txn) {
-      int num_bytes = 0;
-      // Calculate num_bytes to be removed
-      if (obc->obs.oi.soid.is_snap()) {
-        ceph_assert(obc->ssc->snapset.clone_overlap.count(obc->obs.oi.soid.snap));
-        num_bytes = obc->ssc->snapset.get_clone_bytes(obc->obs.oi.soid.snap);
-      } else {
-        num_bytes = obc->obs.oi.size;
-      }
-      return backend.remove(os, txn, *osd_op_params,
-                            delta_stats, whiteout, num_bytes);
+      struct emptyctx_t {};
+      return with_effect_on_obc(
+       emptyctx_t{},
+       [&](auto &ctx) {
+         int num_bytes = 0;
+         // Calculate num_bytes to be removed
+         if (obc->obs.oi.soid.is_snap()) {
+           ceph_assert(obc->ssc->snapset.clone_overlap.count(
+                         obc->obs.oi.soid.snap));
+           num_bytes = obc->ssc->snapset.get_clone_bytes(
+             obc->obs.oi.soid.snap);
+         } else {
+           num_bytes = obc->obs.oi.size;
+         }
+         return backend.remove(os, txn, *osd_op_params,
+                               delta_stats, whiteout, num_bytes);
+       },
+       [](auto &&ctx, ObjectContextRef obc, Ref<PG>) {
+         return seastar::do_for_each(
+           obc->watchers,
+           [](auto &p) { return p.second->remove(); }
+         ).then([obc] {
+           obc->watchers.clear();
+           return seastar::now();
+         });
+       });
     });
   }
   case CEPH_OSD_OP_CALL: