]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rbd: changes needed to align rest with the proposed ones
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Fri, 22 Nov 2024 19:46:39 +0000 (01:16 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:26 +0000 (21:26 +0530)
Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
20 files changed:
src/librbd/api/Group.cc
src/librbd/api/Mirror.cc
src/librbd/api/Utils.cc
src/librbd/deep_copy/SnapshotCopyRequest.cc
src/librbd/deep_copy/SnapshotCreateRequest.cc
src/librbd/group/UnlinkPeerGroupRequest.cc
src/librbd/mirror/EnableRequest.cc
src/librbd/mirror/ImageStateUpdateRequest.cc
src/librbd/mirror/snapshot/CreateNonPrimaryRequest.cc
src/librbd/mirror/snapshot/CreateNonPrimaryRequest.h
src/librbd/mirror/snapshot/PromoteRequest.cc
src/test/librbd/mirror/snapshot/test_mock_CreateNonPrimaryRequest.cc
src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc
src/tools/rbd_mirror/group_replayer/BootstrapRequest.cc
src/tools/rbd_mirror/group_replayer/Replayer.cc
src/tools/rbd_mirror/group_replayer/Replayer.h
src/tools/rbd_mirror/image_replayer/PrepareLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/snapshot/CreateLocalImageRequest.cc
src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc
src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h

index 9721f63c323819d9b94232bc7c87ee16d103d8c0..ec22b13de9aed4e26aeeb2dec653ccbcdbf47b04 100644 (file)
@@ -264,7 +264,7 @@ int GroupSnapshot_to_group_snap_info2(
 }
 
 bool is_user_snapshot(const cls::rbd::GroupSnapshot &group_snap) {
-  auto ns = std::get_if<cls::rbd::UserGroupSnapshotNamespace>(
+  auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceUser>(
       &group_snap.snapshot_namespace);
   return ns != nullptr;
 }
index fa5e0eaf6ac960f90426a7d613d7014315e546f2..4a04ae7a9d4969e924dc3dc68bdbaee8afab3c45 100644 (file)
@@ -515,7 +515,7 @@ int get_last_mirror_snapshot_state(librados::IoCtx &group_ioctx,
   }
 
   for (auto it = snaps.rbegin(); it != snaps.rend(); it++) {
-    auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &it->snapshot_namespace);
     if (ns != nullptr) {
       // XXXMG: check primary_mirror_uuid matches?
@@ -2360,7 +2360,7 @@ int prepare_group_images(IoCtx& group_ioctx,
     return r;
   }
 
-  group_snap->snapshot_namespace = cls::rbd::MirrorGroupSnapshotNamespace{
+  group_snap->snapshot_namespace = cls::rbd::GroupSnapshotNamespaceMirror{
                                      state, mirror_peer_uuids, {}, {}};
 
   for (auto image_ctx: *image_ctxs) {
@@ -2634,7 +2634,7 @@ int Mirror<I>::group_enable(IoCtx& group_ioctx, const char *group_name,
   uuid_gen.generate_random();
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, uuid_gen.to_string(),
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
@@ -2850,7 +2850,7 @@ int Mirror<I>::group_disable(IoCtx& group_ioctx, const char *group_name,
   }
 
   for (auto &snap : snaps) {
-    auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &snap.snapshot_namespace);
     if (ns == nullptr) {
       continue;
@@ -3050,7 +3050,7 @@ int Mirror<I>::group_promote(IoCtx& group_ioctx, const char *group_name,
   std::string group_snap_id = librbd::util::generate_image_id(group_ioctx);
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, mirror_group.global_group_id,
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
@@ -3212,7 +3212,7 @@ int Mirror<I>::group_demote(IoCtx& group_ioctx,
   std::string group_snap_id = librbd::util::generate_image_id(group_ioctx);
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, mirror_group.global_group_id,
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
@@ -3369,15 +3369,14 @@ int Mirror<I>::group_resync(IoCtx& group_ioctx, const char *group_name) {
                << " is primary, cannot resync to itself" << dendl;
     return -EINVAL;
   }
+  bufferlist bl;
+  bl.append("true");
 
-  r = cls_client::mirror_group_resync_set(&group_ioctx,
-                                          librbd::util::group_header_name(group_id),
-                                          mirror_group.global_group_id,
-                                          group_name, group_id);
+  r = cls_client::metadata_set(&group_ioctx,
+                               librbd::util::group_header_name(group_id),
+                               {{RBD_GROUP_RESYNC, bl}});
   if (r < 0) {
-    lderr(cct) << "setting group resync with global_group_id="
-               << mirror_group.global_group_id << " failed: "
-               << cpp_strerror(r) << dendl;
+    lderr(cct) << "failed setting metadata: " << cpp_strerror(r) << dendl;
     return r;
   }
 
@@ -3454,7 +3453,7 @@ int Mirror<I>::group_snapshot_create(IoCtx& group_ioctx, const char *group_name,
   std::string group_snap_id = librbd::util::generate_image_id(group_ioctx);
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, mirror_group.global_group_id,
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
@@ -3562,7 +3561,7 @@ int Mirror<I>::group_image_add(IoCtx &group_ioctx,
   std::string group_snap_id = librbd::util::generate_image_id(group_ioctx);
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, mirror_info.global_group_id,
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
@@ -3688,7 +3687,7 @@ int Mirror<I>::group_image_remove(IoCtx &group_ioctx,
   std::string group_snap_id = librbd::util::generate_image_id(group_ioctx);
   cls::rbd::GroupSnapshot group_snap{
       group_snap_id,
-      cls::rbd::MirrorGroupSnapshotNamespace{},
+      cls::rbd::GroupSnapshotNamespaceMirror{},
       prepare_primary_mirror_snap_name(cct, mirror_info.global_group_id,
                                        group_snap_id),
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
index f5a7c57edf98991b85d101684bbc875543ddd239..83e339816f78e5ae4cbcba678e7bdeb52abd9d80 100644 (file)
@@ -156,12 +156,12 @@ template <typename I>
 librados::snap_t get_group_snap_id(
     I *ictx, const cls::rbd::SnapshotNamespace& in_snap_namespace) {
   ceph_assert(ceph_mutex_is_locked(ictx->image_lock));
-  auto it = ictx->snap_ids.lower_bound({cls::rbd::GroupImageSnapshotNamespace{},
+  auto it = ictx->snap_ids.lower_bound({cls::rbd::ImageSnapshotNamespaceGroup{},
                                         ""});
   for (; it != ictx->snap_ids.end(); ++it) {
     if (it->first.first == in_snap_namespace) {
       return it->second;
-    } else if (std::get_if<cls::rbd::GroupImageSnapshotNamespace>(
+    } else if (std::get_if<cls::rbd::ImageSnapshotNamespaceGroup>(
                    &it->first.first) == nullptr) {
       break;
     }
@@ -178,7 +178,7 @@ int group_snap_remove(librados::IoCtx& group_ioctx, const std::string& group_id,
 
   std::vector<librbd::ImageCtx*> ictxs;
 
-  cls::rbd::GroupImageSnapshotNamespace snap_namespace{group_ioctx.get_id(),
+  cls::rbd::ImageSnapshotNamespaceGroup snap_namespace{group_ioctx.get_id(),
                                                        group_id, group_snap.id};
 
   ldout(cct, 20) << "Removing snapshot with group snap_id: " << group_snap.id
index 9507df4b906292f4fd2218ebf63fb49152d94455..bb3006f69982b2a7a7ed4a85ffbd53bdca85c68d 100644 (file)
@@ -358,7 +358,7 @@ void SnapshotCopyRequest<I>::send_snap_create() {
     if (m_snap_seqs.find(src_snap_id) == m_snap_seqs.end()) {
       // the source snapshot is not in our mapping table, ...
       if (std::holds_alternative<cls::rbd::UserSnapshotNamespace>(snap_namespace) ||
-          std::holds_alternative<cls::rbd::GroupImageSnapshotNamespace>(snap_namespace)) {
+          std::holds_alternative<cls::rbd::ImageSnapshotNamespaceGroup>(snap_namespace)) {
         // ... create it since it's a user snapshot
         break;
       } else if (src_snap_id == m_src_snap_id_end) {
@@ -446,7 +446,7 @@ void SnapshotCopyRequest<I>::handle_snap_create(int r) {
       {cls::rbd::UserSnapshotNamespace(), m_snap_name});
   if (snap_it == m_dst_image_ctx->snap_ids.end()) {
     snap_it = m_dst_image_ctx->snap_ids.find(
-        {cls::rbd::GroupImageSnapshotNamespace(), m_snap_name});
+        {cls::rbd::ImageSnapshotNamespaceGroup(), m_snap_name});
   }
   ceph_assert(snap_it != m_dst_image_ctx->snap_ids.end());
   librados::snap_t dst_snap_id = snap_it->second;
index 61a364a1341868d715434ed939888fd35c9bdc88..fd378f1437a5944f87db901d6fb9638565a10352 100644 (file)
@@ -120,7 +120,11 @@ void SnapshotCreateRequest<I>::send_create_object_map() {
 
   m_dst_image_ctx->image_lock.lock_shared();
   auto snap_it = m_dst_image_ctx->snap_ids.find(
-    {cls::rbd::UserSnapshotNamespace(), m_snap_name});
+      {cls::rbd::UserSnapshotNamespace(), m_snap_name});
+  if (snap_it == m_dst_image_ctx->snap_ids.end()) {
+    snap_it = m_dst_image_ctx->snap_ids.find(
+      {cls::rbd::ImageSnapshotNamespaceGroup(), m_snap_name});
+  }
   if (snap_it == m_dst_image_ctx->snap_ids.end()) {
     lderr(m_cct) << "failed to locate snap: " << m_snap_name << dendl;
     m_dst_image_ctx->image_lock.unlock_shared();
index 1200f738a53ffe192cf90226ad086f6088956d96..e2bbc351de451472e36c5c76eb45d1b93a0b2fbc 100644 (file)
@@ -49,7 +49,7 @@ void UnlinkPeerGroupRequest<I>::unlink_peer() {
   auto unlink_unsynced_snap = snaps.end();
   bool unlink_unsynced = false;
   for (auto it = snaps.begin(); it != snaps.end(); it++) {
-    auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &it->snapshot_namespace);
     if (ns != nullptr) {
       // FIXME: after relocate, on new primary the previous primary demoted
index 4e29dedcf46db3dfd17134aa9dc7ff3ed4dc30e6..3dde35ed739d261d9f405e1fa225d0fc3fbcc2bf 100644 (file)
@@ -93,7 +93,9 @@ void EnableRequest<I>::handle_get_mirror_image(int r) {
     return;
   } else if (r == -ENOENT) {
     r = 0;
-    m_mirror_image.group_spec = {m_group_id, m_group_pool_id};
+    if (!m_group_snap_id.empty()) {
+      m_mirror_image.type = cls::rbd::MIRROR_IMAGE_TYPE_GROUP;
+    }
   } else {
     lderr(m_cct) << "failed to retrieve mirror image: " << cpp_strerror(r)
                  << dendl;
index 31d3b9f87fa248d153032bb648b449a63b807db8..328178daaec96fa4f27fd7717ff98269eb9f621d 100644 (file)
@@ -121,7 +121,7 @@ void ImageStateUpdateRequest<I>::handle_set_mirror_image(int r) {
 template <typename I>
 void ImageStateUpdateRequest<I>::notify_mirroring_watcher() {
   // skip image notification if mirroring for the image group is disabled
-  if (m_mirror_image.group_spec.is_valid()) {
+  if (m_mirror_image.type == cls::rbd::MIRROR_IMAGE_TYPE_GROUP) {
     finish(0);
     return;
   }
index f7dbe405d50711d01c2f90f203c069db11ebabe0..70fa8e8f5da5bc7d74bb113d26a739563562ecb2 100644 (file)
@@ -29,10 +29,12 @@ using librbd::util::create_rados_callback;
 
 template <typename I>
 CreateNonPrimaryRequest<I>::CreateNonPrimaryRequest(
-    I* image_ctx, bool demoted, const std::string &primary_mirror_uuid,
+    I* image_ctx, bool demoted, const std::string group_id,
+    const std::string group_snap_id, const std::string &primary_mirror_uuid,
     uint64_t primary_snap_id, const SnapSeqs& snap_seqs,
     const ImageState &image_state, uint64_t *snap_id, Context *on_finish)
   : m_image_ctx(image_ctx), m_demoted(demoted),
+    m_group_id(group_id), m_group_snap_id(group_snap_id),
     m_primary_mirror_uuid(primary_mirror_uuid),
     m_primary_snap_id(primary_snap_id), m_snap_seqs(snap_seqs),
     m_image_state(image_state), m_snap_id(snap_id), m_on_finish(on_finish) {
@@ -189,6 +191,10 @@ void CreateNonPrimaryRequest<I>::create_snapshot() {
   if (m_demoted) {
     ns.mirror_peer_uuids = m_mirror_peer_uuids;
   }
+  if (!m_group_snap_id.empty()) {
+    ns.group_spec = {m_group_id, m_image_ctx->md_ctx.get_id()};
+    ns.group_snap_id = m_group_snap_id;
+  }
   ns.snap_seqs = m_snap_seqs;
   ns.complete = is_orphan();
   ldout(cct, 15) << "ns=" << ns << dendl;
index 4828a8a0d84cb225ada56ab3be5218f75a3768be..0ad94012af123ef6f95c9e8c2b5a599cb8432b52 100644 (file)
@@ -27,19 +27,24 @@ class CreateNonPrimaryRequest {
 public:
   static CreateNonPrimaryRequest *create(ImageCtxT *image_ctx,
                                          bool demoted,
+                                         const std::string group_id,
+                                         const std::string group_snap_id,
                                          const std::string &primary_mirror_uuid,
                                          uint64_t primary_snap_id,
                                          const SnapSeqs& snap_seqs,
                                          const ImageState &image_state,
                                          uint64_t *snap_id,
                                          Context *on_finish) {
-    return new CreateNonPrimaryRequest(image_ctx, demoted, primary_mirror_uuid,
+    return new CreateNonPrimaryRequest(image_ctx, demoted, group_id,
+                                       group_snap_id, primary_mirror_uuid,
                                        primary_snap_id, snap_seqs,
                                        image_state, snap_id, on_finish);
   }
 
   CreateNonPrimaryRequest(ImageCtxT *image_ctx,
                           bool demoted,
+                          const std::string group_id,
+                          const std::string group_snap_id,
                           const std::string &primary_mirror_uuid,
                           uint64_t primary_snap_id,
                           const SnapSeqs& snap_seqs,
@@ -77,6 +82,8 @@ private:
 
   ImageCtxT *m_image_ctx;
   const bool m_demoted;
+  const std::string m_group_id;
+  const std::string m_group_snap_id;
   const std::string m_primary_mirror_uuid;
   const uint64_t m_primary_snap_id;
   const SnapSeqs m_snap_seqs;
index 068c96a307dfb8ecca962d8421b509b942462531..a732a7ea38afffca48ae97de1e084c45347780e1 100644 (file)
@@ -62,7 +62,7 @@ void PromoteRequest<I>::create_orphan_snapshot() {
     &PromoteRequest<I>::handle_create_orphan_snapshot>(this);
 
   auto req = CreateNonPrimaryRequest<I>::create(
-    m_image_ctx, false, "", CEPH_NOSNAP, {}, {}, nullptr, ctx);
+    m_image_ctx, false, "", "", "", CEPH_NOSNAP, {}, {}, nullptr, ctx);
   req->send();
 }
 
index bba726149d82ebc06f0a40696f063e6e4d8c79aa..f0b55bcac29194cfa1a966d974e663337cae7fbc 100644 (file)
@@ -194,7 +194,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, Success) {
   expect_write_image_state(mock_image_ctx, mock_write_image_state_request, 0);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -226,7 +226,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, SuccessDemoted) {
   expect_write_image_state(mock_image_ctx, mock_write_image_state_request, 0);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -246,7 +246,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, RefreshError) {
   expect_refresh_image(mock_image_ctx, true, -EINVAL);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -269,7 +269,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, GetMirrorImageError) {
                      cls::rbd::MIRROR_IMAGE_STATE_ENABLED}, -EINVAL);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -294,7 +294,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, CanNotError) {
   expect_can_create_non_primary_snapshot(mock_utils, false);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -321,7 +321,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, GetMirrorPeersError) {
   expect_get_mirror_peers(mock_image_ctx, {}, -EPERM);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, true, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -347,7 +347,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, CreateSnapshotError) {
   expect_create_snapshot(mock_image_ctx, -EINVAL);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
@@ -376,7 +376,7 @@ TEST_F(TestMockMirrorSnapshotCreateNonPrimaryRequest, WriteImageStateError) {
                            -EINVAL);
 
   C_SaferCond ctx;
-  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false,
+  auto req = new MockCreateNonPrimaryRequest(&mock_image_ctx, false, "", "",
                                              "mirror_uuid", 123, {{1, 2}}, {},
                                              nullptr, &ctx);
   req->send();
index 6dcde3d25f516b3175ea152c98d7ed7645579c14..d91ec4b2006dbbf81622f6375ef2343e1fefd664 100644 (file)
@@ -92,6 +92,8 @@ struct CreateNonPrimaryRequest<MockTestImageCtx> {
   static CreateNonPrimaryRequest* s_instance;
   static CreateNonPrimaryRequest *create(MockTestImageCtx *image_ctx,
                                          bool demoted,
+                                         const std::string group_id,
+                                         const std::string group_snap_id,
                                          const std::string &primary_mirror_uuid,
                                          uint64_t primary_snap_id,
                                          SnapSeqs snap_seqs,
index e383510029c72885b4ec749061496e356047bb0c..2a430c0f44025c85ca0d8bfb72f10d68ae31c00e 100644 (file)
@@ -37,7 +37,7 @@ static const uint32_t MAX_RETURN = 1024;
 bool is_demoted_snap_exists(
     const std::vector<cls::rbd::GroupSnapshot> &snaps) {
   for (auto it = snaps.rbegin(); it != snaps.rend(); it++) {
-     auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+     auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
        &it->snapshot_namespace);
     if (ns != nullptr) {
       if (ns->is_demoted()) {
@@ -52,7 +52,7 @@ int get_last_mirror_snapshot_state(
     const std::vector<cls::rbd::GroupSnapshot> &snaps,
     cls::rbd::MirrorSnapshotState *state) {
   for (auto it = snaps.rbegin(); it != snaps.rend(); it++) {
-    auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &it->snapshot_namespace);
     if (ns != nullptr) {
       // XXXMG: check primary_mirror_uuid matches?
@@ -114,20 +114,15 @@ template <typename I>
 void BootstrapRequest<I>::send() {
   *m_resync_requested = false;
 
-  std::string group_id;
-
   if (m_local_group_id && !m_local_group_id->empty()) {
     std::string group_header_oid = librbd::util::group_header_name(
         *m_local_group_id);
-    int r = librbd::cls_client::mirror_group_resync_get(&m_local_io_ctx,
-        group_header_oid,
-        m_global_group_id,
-        m_local_group_ctx->name,
-        &group_id);
-    if (r < 0) {
-      derr << "getting mirror group resync for global_group_id="
-        << m_global_group_id << " failed: " << cpp_strerror(r) << dendl;
-    } else if (r == 0 && group_id == *m_local_group_id) {
+    std::string value;
+    int r = librbd::cls_client::metadata_get(&m_local_io_ctx, group_header_oid,
+                                             RBD_GROUP_RESYNC, &value);
+    if (r < 0 && r != -ENOENT) {
+      derr << "failed reading metadata: " << cpp_strerror(r) << dendl;
+    } else if (r == 0) {
       *m_resync_requested = true;
     }
   }
@@ -1260,7 +1255,7 @@ void BootstrapRequest<I>::create_local_non_primary_group_snapshot() {
   std::string group_snap_id = librbd::util::generate_image_id(m_local_io_ctx);
   cls::rbd::GroupSnapshot group_snap{
     group_snap_id,
-    cls::rbd::MirrorGroupSnapshotNamespace{
+    cls::rbd::GroupSnapshotNamespaceMirror{
       cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY,
       {}, remote_pool_meta.mirror_peer_uuid, {}},
       prepare_non_primary_mirror_snap_name(m_global_group_id, group_snap_id),
index e35721fb6b5ba4b16a7f3349751be766b22b2b0b..d6fa67bb24ca0a28fc5d50884f71e8f293e9a067 100644 (file)
@@ -132,18 +132,14 @@ template <typename I>
 bool Replayer<I>::is_resync_requested() {
   dout(10) << "m_local_group_id=" << m_local_group_id << dendl;
 
-  std::string group_id;
   std::string group_header_oid = librbd::util::group_header_name(
       m_local_group_id);
-  int r = librbd::cls_client::mirror_group_resync_get(&m_local_io_ctx,
-                                                      group_header_oid,
-                                                      m_global_group_id,
-                                                      m_local_group_ctx->name,
-                                                      &group_id);
-  if (r < 0 && r != -EINVAL) {
-    derr << "getting mirror group resync for global_group_id="
-         << m_global_group_id << " failed: " << cpp_strerror(r) << dendl;
-  } else if (r == 0 && group_id == m_local_group_id) {
+  std::string value;
+  int r = librbd::cls_client::metadata_get(&m_local_io_ctx, group_header_oid,
+                                           RBD_GROUP_RESYNC, &value);
+  if (r < 0 && r != -ENOENT) {
+    derr << "failed reading metadata: " << cpp_strerror(r) << dendl;
+  } else if (r == 0) {
     return true;
   }
 
@@ -241,7 +237,7 @@ void Replayer<I>::handle_load_local_group_snapshots(int r) {
 
   for (auto it = m_local_group_snaps.rbegin();
        it != m_local_group_snaps.rend(); it++) {
-    auto ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &it->snapshot_namespace);
     if (ns == nullptr) {
       continue;
@@ -293,7 +289,7 @@ void Replayer<I>::handle_load_remote_group_snapshots(int r) {
       return;
     }
 
-    auto last_local_snap_ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto last_local_snap_ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &last_local_snap->snapshot_namespace);
     if (last_local_snap_ns &&
         last_local_snap_ns->state == cls::rbd::MIRROR_SNAPSHOT_STATE_NON_PRIMARY_DEMOTED &&
@@ -453,7 +449,7 @@ void Replayer<I>::scan_for_unsynced_group_snapshots(
        local_snap != m_local_group_snaps.rend(); ++local_snap) {
     auto snap_type = cls::rbd::get_group_snap_namespace_type(
         local_snap->snapshot_namespace);
-    auto local_snap_ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto local_snap_ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &local_snap->snapshot_namespace);
     auto next_remote_snap = m_remote_group_snaps.end();
     if (snap_type == cls::rbd::GROUP_SNAPSHOT_NAMESPACE_TYPE_USER ||
@@ -500,7 +496,7 @@ void Replayer<I>::scan_for_unsynced_group_snapshots(
       if (snap_type != cls::rbd::GROUP_SNAPSHOT_NAMESPACE_TYPE_MIRROR) {
         continue;
       }
-      auto prev_remote_snap_ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+      auto prev_remote_snap_ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
           &prev_remote_snap->snapshot_namespace);
       if (prev_remote_snap_ns && prev_remote_snap_ns->is_demoted()) {
         break;
@@ -549,7 +545,7 @@ void Replayer<I>::try_create_group_snapshot(cls::rbd::GroupSnapshot snap) {
   auto snap_type = cls::rbd::get_group_snap_namespace_type(
       snap.snapshot_namespace);
   if (snap_type == cls::rbd::GROUP_SNAPSHOT_NAMESPACE_TYPE_MIRROR) {
-    auto snap_ns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+    auto snap_ns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
         &snap.snapshot_namespace);
     if (snap_ns->is_non_primary()) {
       dout(10) << "remote group snapshot: " << snap.id << "is non primary"
@@ -596,7 +592,7 @@ void Replayer<I>::create_mirror_snapshot(
         {remote_group_snap_id, {}}).first;
     cls::rbd::GroupSnapshot local_snap =
       {remote_group_snap_id,
-       cls::rbd::MirrorGroupSnapshotNamespace{
+       cls::rbd::GroupSnapshotNamespaceMirror{
          snap_state, {}, m_remote_mirror_uuid, remote_group_snap_id},
        {}, cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
     local_snap.name = prepare_non_primary_mirror_snap_name(m_global_group_id,
@@ -648,11 +644,6 @@ void Replayer<I>::mirror_snapshot_complete(
       return s.id == remote_group_snap_id;
       });
   if (itr->snaps.size() != 0) {
-    // update image snap
-    C_SaferCond *ctx = new C_SaferCond;
-    update_image_snapshot(remote_group_snap_id, *spec, ctx);
-    ctx->wait();
-
     // update the group snap with snap spec
     itl->snaps.push_back(*spec);
   }
@@ -706,7 +697,7 @@ void Replayer<I>::handle_mirror_snapshot_complete(
       });
 
   ceph_assert(itr != m_remote_group_snaps.end());
-  auto rns = std::get_if<cls::rbd::MirrorGroupSnapshotNamespace>(
+  auto rns = std::get_if<cls::rbd::GroupSnapshotNamespaceMirror>(
       &itr->snapshot_namespace);
   if (rns != nullptr) {
     rns->mirror_peer_uuids.clear();
@@ -802,51 +793,6 @@ void Replayer<I>::unlink_group_snapshots(
   }
 }
 
-template <typename I>
-void Replayer<I>::update_image_snapshot(
-    const std::string &remote_group_snap_id,
-    cls::rbd::ImageSnapshotSpec spec,
-    Context *on_finish) {
-  dout(10) << "local group snap info: "
-           << "image snap id: " << spec.snap_id
-           << ", image id: " << spec.image_id
-           << ", group snap id: " << remote_group_snap_id
-           << dendl;
-  std::string image_header_oid = librbd::util::header_name(spec.image_id);
-  cls::rbd::SnapshotInfo snap_info;
-  int r = librbd::cls_client::snapshot_get(&m_local_io_ctx, image_header_oid,
-      spec.snap_id, &snap_info);
-  if (r < 0) {
-    derr << "failed getting snap info for snap id: " << spec.snap_id
-         << ", : " << cpp_strerror(r) << dendl;
-    return;
-  }
-  auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
-      &snap_info.snapshot_namespace);
-  ceph_assert(mirror_ns != nullptr);
-  mirror_ns->group_spec = {m_local_group_id, spec.pool};
-  mirror_ns->group_snap_id = remote_group_snap_id;
-
-  // write to disk
-  librados::ObjectWriteOperation op;
-  librbd::cls_client::snapshot_add(&op, snap_info.id, snap_info.name,
-                                   *mirror_ns);
-  auto comp = create_rados_callback(
-    new LambdaContext([this, snap_info, on_finish](int r) {
-      handle_update_image_snapshot(r, snap_info.id, on_finish);
-    }));
-  r = m_local_io_ctx.aio_operate(image_header_oid, comp, &op);
-  ceph_assert(r == 0);
-  comp->release();
-}
-
-template <typename I>
-void Replayer<I>::handle_update_image_snapshot(
-    int r, uint64_t local_snap_id, Context *on_finish) {
-  dout(10) << "snap id: " << local_snap_id << ", r=" << r << dendl;
-  on_finish->complete(r);
-}
-
 template <typename I>
 void Replayer<I>::create_regular_snapshot(
     const std::string &remote_group_snap_name,
@@ -856,7 +802,7 @@ void Replayer<I>::create_regular_snapshot(
   librados::ObjectWriteOperation op;
   cls::rbd::GroupSnapshot group_snap{
     remote_group_snap_id, // keeping it same as remote group snap id
-    cls::rbd::UserGroupSnapshotNamespace{},
+    cls::rbd::GroupSnapshotNamespaceUser{},
       remote_group_snap_name,
       cls::rbd::GROUP_SNAPSHOT_STATE_INCOMPLETE};
 
index b5ed92a73b9acfd7e57287921f1ad933a23c46fd..ff35c16a734df393c69488e5c7e1584b9bbd51f5 100644 (file)
@@ -143,13 +143,6 @@ private:
 
   void unlink_group_snapshots(const std::string &remote_group_snap_id);
 
-  void update_image_snapshot(
-    const std::string &remote_group_snap_id,
-    cls::rbd::ImageSnapshotSpec spec,
-    Context *on_finish);
-  void handle_update_image_snapshot(
-    int r, uint64_t local_snap_id, Context *on_finish);
-
   void create_regular_snapshot(
     const std::string &remote_group_snap_name,
     const std::string &remote_group_snap_id,
index b08d83ca27754a9a1e66b4a4df323a4f62247bc0..4bb90e831f135056a31b38930513504e5a131e10 100644 (file)
@@ -126,7 +126,7 @@ void PrepareLocalImageRequest<I>::handle_get_mirror_info(int r) {
   }
 
   if (m_mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_CREATING &&
-      !m_mirror_image.group_spec.is_valid()) {
+      m_mirror_image.type == cls::rbd::MIRROR_IMAGE_TYPE_STANDALONE) {
     dout(5) << "local image is still in creating state, issuing a removal"
             << dendl;
     move_to_trash();
index 14eddf4815c8d032c5b2ff93177d4036dc507d4c..885d1181d9cf55796137ea7b435d77d2b0daf4e9 100644 (file)
@@ -47,13 +47,12 @@ void CreateLocalImageRequest<I>::disable_mirror_image() {
 
   // need to send 'disabling' since the cls methods will fail if we aren't
   // in that state
-  cls::rbd::GroupSpec group_spec;
+  cls::rbd::MirrorImageType type =  cls::rbd::MIRROR_IMAGE_TYPE_STANDALONE;
   if (m_local_group_ctx != nullptr) {
-    group_spec = {m_local_group_ctx->group_id,
-                  m_local_group_ctx->io_ctx.get_id()};
+    type = cls::rbd::MIRROR_IMAGE_TYPE_GROUP;
   }
   cls::rbd::MirrorImage mirror_image{
-    cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT, m_global_image_id, group_spec,
+    cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT, m_global_image_id, type,
     cls::rbd::MIRROR_IMAGE_STATE_DISABLING};
   librados::ObjectWriteOperation op;
   librbd::cls_client::mirror_image_set(&op, m_state_builder->local_image_id,
@@ -121,15 +120,14 @@ void CreateLocalImageRequest<I>::add_mirror_image() {
   dout(10) << "local_image_id=" << m_state_builder->local_image_id << dendl;
   update_progress("ADD_MIRROR_IMAGE");
 
-  cls::rbd::GroupSpec group_spec;
+  cls::rbd::MirrorImageType type =  cls::rbd::MIRROR_IMAGE_TYPE_STANDALONE;
   if (m_local_group_ctx != nullptr) {
-    group_spec = {m_local_group_ctx->group_id,
-                  m_local_group_ctx->io_ctx.get_id()};
+    type = cls::rbd::MIRROR_IMAGE_TYPE_GROUP;
   }
   // use 'creating' to track a partially constructed image. it will
   // be switched to 'enabled' once the image is fully created
   cls::rbd::MirrorImage mirror_image{
-    cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT, m_global_image_id, group_spec,
+    cls::rbd::MIRROR_IMAGE_MODE_SNAPSHOT, m_global_image_id, type,
     cls::rbd::MIRROR_IMAGE_STATE_CREATING};
   librados::ObjectWriteOperation op;
   librbd::cls_client::mirror_image_set(&op, m_state_builder->local_image_id,
index 9773737de862a908385b51e2d91fe0e7e28cdc20..e7274069701434e51e1d37f1828b5ee71b10ca45 100644 (file)
@@ -1027,6 +1027,7 @@ void Replayer<I>::create_non_primary_snapshot() {
     Replayer<I>, &Replayer<I>::handle_create_non_primary_snapshot>(this);
   auto req = librbd::mirror::snapshot::CreateNonPrimaryRequest<I>::create(
     local_image_ctx, m_remote_mirror_snap_ns.is_demoted(),
+    m_local_group_id, m_remote_mirror_snap_ns.group_snap_id,
     m_state_builder->remote_mirror_uuid, m_remote_snap_id_end,
     m_local_mirror_snap_ns.snap_seqs, m_image_state, &m_local_snap_id_end, ctx);
   req->send();
@@ -1045,68 +1046,6 @@ void Replayer<I>::handle_create_non_primary_snapshot(int r) {
 
   dout(15) << "local_snap_id_end=" << m_local_snap_id_end << dendl;
 
-  update_image_snapshot();
-}
-
-template <typename I>
-void Replayer<I>::update_image_snapshot() {
-  if (!m_remote_mirror_snap_ns.group_spec.is_valid() &&
-      m_remote_mirror_snap_ns.group_snap_id.empty()) {
-    std::unique_lock locker{m_lock};
-    update_mirror_image_state();
-    return;
-  }
-  dout(10) << dendl;
-
-  auto local_image_ctx = m_state_builder->local_image_ctx;
-  bool snap_valid = false;
-  cls::rbd::SnapshotNamespace snap_namespace;
-  std::string snap_name;
-  uint64_t snap_id = m_local_snap_id_end;
-
-  {
-    std::shared_lock image_locker{local_image_ctx->image_lock};
-    auto snap_info = local_image_ctx->get_snap_info(snap_id);
-    if (snap_info != nullptr) {
-      snap_valid = true;
-      snap_namespace = snap_info->snap_namespace;
-      snap_name = snap_info->name;
-    }
-  }
-
-  if (!snap_valid) {
-    derr << "failed to get snap info" << dendl;
-    handle_replay_complete(-EINVAL, "invalid local mirror snapshot state");
-    return;
-  }
-  auto mirror_ns = std::get_if<cls::rbd::MirrorSnapshotNamespace>(
-      &snap_namespace);
-  ceph_assert(mirror_ns != nullptr);
-  //mirror_ns->group_spec = {m_local_group_id, spec.pool};
-
-  m_local_mirror_snap_ns = *mirror_ns;
-  m_local_mirror_snap_ns.group_snap_id = m_remote_mirror_snap_ns.group_snap_id;
-
-  // write to disk
-  librados::ObjectWriteOperation op;
-  librbd::cls_client::snapshot_add(&op, snap_id, snap_name,
-                                   m_local_mirror_snap_ns);
-  auto ctx = new C_TrackedOp(
-    m_in_flight_op_tracker, new LambdaContext([this, snap_id](int r) {
-      handle_update_image_snapshot(r, snap_id);
-    }));
-  auto aio_comp = create_rados_callback(ctx);
-  int r = local_image_ctx->md_ctx.aio_operate(
-      local_image_ctx->header_oid, aio_comp, &op);
-  ceph_assert(r == 0);
-  aio_comp->release();
-}
-
-template <typename I>
-void Replayer<I>::handle_update_image_snapshot(
-    int r, uint64_t local_snap_id) {
-  dout(10) << "snap id: " << local_snap_id << ", r=" << r << dendl;
-
   update_mirror_image_state();
 }
 
index 0b90dc928e6d8e2dac34fa588682709c0a948913..a3b66630f7bcbffc128669409f68af61b2ba79af 100644 (file)
@@ -319,9 +319,6 @@ private:
   void update_non_primary_snapshot(bool complete);
   void handle_update_non_primary_snapshot(bool complete, int r);
 
-  void update_image_snapshot();
-  void handle_update_image_snapshot(int r, uint64_t local_snap_id);
-
   void notify_image_update();
   void handle_notify_image_update(int r);