]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/api: add defence in group enable to bail about different pool images
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Tue, 25 Mar 2025 19:39:52 +0000 (01:09 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:37 +0000 (21:26 +0530)
If a group contains images from different pools do not allow enabling
mirroring on it.

Thanks to Ilya for all the suggestions and review.

Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
src/librbd/api/Mirror.cc

index df0aff0e2380ea84caae07b708a84b1de5ac1f08..f33db22ddf8d035cc0ff2f3cc745883934f8c8d2 100644 (file)
@@ -2436,10 +2436,11 @@ void Mirror<I>::image_snapshot_create(I *ictx, uint32_t flags,
 template <typename I>
 int prepare_group_images(IoCtx& group_ioctx,
                          std::string group_id,
+                         cls::rbd::MirrorGroupState group_state,
                          std::vector<I *> *image_ctxs,
                          cls::rbd::GroupSnapshot *group_snap,
                          std::vector<uint64_t> &quiesce_requests,
-                         cls::rbd::MirrorSnapshotState state,
+                         cls::rbd::MirrorSnapshotState snap_state,
                          std::set<std::string> *mirror_peer_uuids,
                          uint64_t internal_flags) {
   CephContext *cct = (CephContext *)group_ioctx.cct();
@@ -2471,8 +2472,19 @@ int prepare_group_images(IoCtx& group_ioctx,
     return r;
   }
 
+  if (group_state != cls::rbd::MIRROR_GROUP_STATE_ENABLED) {
+    auto group_pool_id = group_ioctx.get_id();
+    for (auto image_ctx: *image_ctxs) {
+      if (group_pool_id != image_ctx->md_ctx.get_id()) {
+        lderr(cct) << "group image resides in a different pool, mirroring is not supported"
+                   << dendl;
+        return -ENOTSUP;
+      }
+    }
+  }
+
   group_snap->snapshot_namespace = cls::rbd::GroupSnapshotNamespaceMirror{
-                                     state, *mirror_peer_uuids, {}, {}};
+                                     snap_state, *mirror_peer_uuids, {}, {}};
 
   for (auto image_ctx: *image_ctxs) {
     group_snap->snaps.emplace_back(image_ctx->md_ctx.get_id(), image_ctx->id,
@@ -2781,8 +2793,8 @@ int Mirror<I>::group_enable(IoCtx& group_ioctx, const char *group_name,
   std::vector<uint64_t> quiesce_requests;
   std::vector<I *> image_ctxs;
   std::set<std::string> mirror_peer_uuids;
-  r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
-                           &group_snap, quiesce_requests,
+  r = prepare_group_images(group_ioctx, group_id, mirror_group.state,
+                           &image_ctxs, &group_snap, quiesce_requests,
                            cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY,
                            &mirror_peer_uuids,
                            internal_flags);
@@ -3225,8 +3237,8 @@ int Mirror<I>::group_promote(IoCtx& group_ioctx, const char *group_name,
   std::vector<uint64_t> quiesce_requests;
   std::vector<I *> image_ctxs;
   std::set<std::string> mirror_peer_uuids;
-  r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
-                           &group_snap, quiesce_requests,
+  r = prepare_group_images(group_ioctx, group_id, mirror_group.state,
+                           &image_ctxs, &group_snap, quiesce_requests,
                            cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY,
                            &mirror_peer_uuids,
                            SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE);
@@ -3273,8 +3285,8 @@ int Mirror<I>::group_promote(IoCtx& group_ioctx, const char *group_name,
     }
     close_images(&image_ctxs);
 
-    r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
-                             &group_snap, quiesce_requests,
+    r = prepare_group_images(group_ioctx, group_id, mirror_group.state,
+                             &image_ctxs, &group_snap, quiesce_requests,
                              cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED,
                              &mirror_peer_uuids,
                              SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE);
@@ -3388,8 +3400,8 @@ int Mirror<I>::group_demote(IoCtx& group_ioctx,
   std::vector<uint64_t> quiesce_requests;
   std::vector<I *> image_ctxs;
   std::set<std::string> mirror_peer_uuids;
-  r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
-                           &group_snap, quiesce_requests,
+  r = prepare_group_images(group_ioctx, group_id, mirror_group.state,
+                           &image_ctxs, &group_snap, quiesce_requests,
                            cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED,
                            &mirror_peer_uuids,
                            SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE);
@@ -3437,8 +3449,8 @@ int Mirror<I>::group_demote(IoCtx& group_ioctx,
     }
     close_images(&image_ctxs);
 
-    r = prepare_group_images(group_ioctx, group_id, &image_ctxs,
-                             &group_snap, quiesce_requests,
+    r = prepare_group_images(group_ioctx, group_id, mirror_group.state,
+                             &image_ctxs, &group_snap, quiesce_requests,
                              cls::rbd::MIRROR_SNAPSHOT_STATE_PRIMARY_DEMOTED,
                              &mirror_peer_uuids,
                              SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE);