]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: prune snapshots added to the list on image_replayer shutdown
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Mon, 5 Aug 2024 04:14:38 +0000 (09:44 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:25 +0000 (21:26 +0530)
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
src/librbd/api/Mirror.cc
src/librbd/group/UnlinkPeerGroupRequest.cc
src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc
src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h

index 61b68582766e4d9fa3fd69222bf3265bae61b4ca..4d6e2f134a864d4c0ead8cd3c5253cb5686aecf9 100644 (file)
@@ -3157,7 +3157,7 @@ int Mirror<I>::group_demote(IoCtx& group_ioctx,
 
     r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
                              &group_snap, quiesce_requests,
-                             cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY,
+                             cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED,
                              flags);
     if (r != 0) {
       return r;
index c04a319308e34e61f2d16a0b3483308a6e446ec4..374d10870c41013627a1cd656c57ce3aa6cbcacf 100644 (file)
@@ -52,7 +52,10 @@ void UnlinkPeerGroupRequest<I>::unlink_peer() {
     auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
         &it->snapshot_namespace);
     if (ns != nullptr) {
-      if (ns->state != cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY) {
+      // FIXME: after relocate, on new primary the previous primary demoted
+      // snap is not getting deleted, until the next demotion.
+      if (ns->state != cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY &&
+          ns->state != cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY) {
         continue;
       }
       count++;
index fa2310a05761577889c94e63f6bd2704f2b80c2c..0da7cb8dc88e3d7e06716ada9fbe9fafc8928ba6 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "Replayer.h"
 #include "common/Clock.h" // for ceph_clock_now()
+#include "common/Cond.h"
 #include "common/debug.h"
 #include "common/errno.h"
 #include "common/perf_counters.h"
@@ -205,6 +206,19 @@ void Replayer<I>::shut_down(Context* on_finish) {
     dout(10) << "shut down pending on completion of snapshot replay" << dendl;
     return;
   }
+
+  if (!m_prune_snap_ids.empty()) {
+    locker.unlock();
+
+    auto prune_snap_id = *m_prune_snap_ids.begin();
+    dout(5) << "pruning unused non-primary snapshot " << prune_snap_id << dendl;
+    C_SaferCond ctx;
+    prune_non_primary_snapshot(&ctx, prune_snap_id);
+    ctx.wait();
+    m_on_init_shutdown = nullptr;
+    shut_down(on_finish);
+    return;
+  }
   locker.unlock();
 
   unregister_remote_update_watcher();
@@ -541,7 +555,7 @@ void Replayer<I>::scan_local_mirror_snapshots(
 
     auto prune_snap_id = *m_prune_snap_ids.begin();
     dout(5) << "pruning unused non-primary snapshot " << prune_snap_id << dendl;
-    prune_non_primary_snapshot(prune_snap_id);
+    prune_non_primary_snapshot(nullptr, prune_snap_id);
     return;
   }
 
@@ -778,7 +792,8 @@ void Replayer<I>::scan_remote_mirror_snapshots(
 }
 
 template <typename I>
-void Replayer<I>::prune_non_primary_snapshot(uint64_t snap_id) {
+void Replayer<I>::prune_non_primary_snapshot(
+    Context* on_finish, uint64_t snap_id) {
   dout(10) << "snap_id=" << snap_id << dendl;
 
   auto local_image_ctx = m_state_builder->local_image_ctx;
@@ -804,6 +819,9 @@ void Replayer<I>::prune_non_primary_snapshot(uint64_t snap_id) {
 
   auto ctx = create_context_callback<
     Replayer<I>, &Replayer<I>::handle_prune_non_primary_snapshot>(this);
+  if (on_finish) {
+    ctx = on_finish;
+  }
   local_image_ctx->operations->snap_remove(snap_namespace, snap_name, ctx);
 }
 
index 57e32a15cae87b8c5b1fde762a996fa08bca2612..fff097eeb3115a77b48a60c9ea59fda4437f43c0 100644 (file)
@@ -285,7 +285,7 @@ private:
   void scan_local_mirror_snapshots(std::unique_lock<ceph::mutex>* locker);
   void scan_remote_mirror_snapshots(std::unique_lock<ceph::mutex>* locker);
 
-  void prune_non_primary_snapshot(uint64_t snap_id);
+  void prune_non_primary_snapshot(Context* on_finish, uint64_t snap_id);
   void handle_prune_non_primary_snapshot(int r);
 
   void copy_snapshots();