]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: don't call group_snap_set for every image snap for regular group snap
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Fri, 21 Mar 2025 17:37:54 +0000 (23:07 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:36 +0000 (21:26 +0530)
It looks like we fixed avoiding of calling group_snap_set() for each image
snapshot update for mirror group snapshot, but for regular group snapshot,
it is still happening. This commit will fix it.

Signed-off-by: Prasanna Kumar Kalever <prasanna.kalever@redhat.com>
src/tools/rbd_mirror/group_replayer/Replayer.cc

index a02929da2263dbafe313566ca0a8ddf4ff73f335..b2157b758425ce694e1228a18ce5e5f897881ddf 100644 (file)
@@ -1163,7 +1163,6 @@ template <typename I>
 void Replayer<I>::regular_snapshot_complete(
     const std::string &group_snap_id,
     Context *on_finish) {
-  dout(10) << dendl;
   std::unique_lock locker{m_lock};
   auto itl = std::find_if(
       m_local_group_snaps.begin(), m_local_group_snaps.end(),
@@ -1248,22 +1247,32 @@ void Replayer<I>::regular_snapshot_complete(
       image_snap_complete = false; // reset
     }
   }
-  locker.lock();
   if (itr->snaps.size() == local_image_snap_specs.size()) {
+    locker.lock();
     itl->snaps = local_image_snap_specs;
     itl->state = cls::rbd::GROUP_SNAPSHOT_STATE_COMPLETE;
-  }
-  librados::ObjectWriteOperation op;
-  librbd::cls_client::group_snap_set(&op, *itl);
+    librados::ObjectWriteOperation op;
+    librbd::cls_client::group_snap_set(&op, *itl);
 
-  auto comp = create_rados_callback(
-      new LambdaContext([this, group_snap_id, on_finish](int r) {
-        handle_regular_snapshot_complete(r, group_snap_id, on_finish);
-      }));
-  int r = m_local_io_ctx.aio_operate(
-      librbd::util::group_header_name(m_local_group_id), comp, &op);
-  ceph_assert(r == 0);
-  comp->release();
+    auto comp = create_rados_callback(
+        new LambdaContext([this, group_snap_id, on_finish](int r) {
+          handle_regular_snapshot_complete(r, group_snap_id, on_finish);
+        }));
+    int r = m_local_io_ctx.aio_operate(
+        librbd::util::group_header_name(m_local_group_id), comp, &op);
+    ceph_assert(r == 0);
+    locker.unlock();
+    comp->release();
+
+    dout(10) << "local group snap info: "
+      << "id: " << itl->id
+      << ", name: " << itl->name
+      << ", state: " << itl->state
+      << ", snaps.size: " << itl->snaps.size()
+      << dendl;
+  } else {
+    on_finish->complete(0);
+  }
 }
 
 template <typename I>