]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: more improvements in the group replayer
authorPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 30 Jan 2025 11:39:30 +0000 (17:09 +0530)
committerPrasanna Kumar Kalever <prasanna.kalever@redhat.com>
Thu, 24 Apr 2025 15:56:26 +0000 (21:26 +0530)
- Arresting the interruptions after shutdown
- Restart GroupReplayer if bootstrap returns remote group id as empty
- Fix a test failure in "regular group snapshots test"

Issue#23

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

index cd3b83f5ff06e6ae8c3e94f8626da2cd59674d3e..a664b8fc79b47ee3b6afd689f379147aec3e8ce3 100644 (file)
@@ -595,9 +595,15 @@ void GroupReplayer<I>::handle_bootstrap_group(int r) {
     return;
   }
 
-  C_SaferCond ctx;
-  create_group_replayer(&ctx);
-  ctx.wait();
+  if (!m_remote_group_id.empty()) {
+    C_SaferCond ctx;
+    create_group_replayer(&ctx);
+    ctx.wait();
+  } else {
+    r = -EINVAL;
+    finish_start(r, "remote is not ready yet"); // bootstrap again
+    return;
+  }
 }
 
 template <typename I>
index 2196ccaadff90ca0750dd3b5ff2fef98417ba541..b22cd7d25ae103799e6ea897bedf56811426e99a 100644 (file)
@@ -69,6 +69,23 @@ Replayer<I>::~Replayer() {
   ceph_assert(m_state == STATE_COMPLETE);
 }
 
+template <typename I>
+bool Replayer<I>::is_replay_interrupted() {
+  std::unique_lock locker{m_lock};
+  return is_replay_interrupted(&locker);
+}
+
+template <typename I>
+bool Replayer<I>::is_replay_interrupted(std::unique_lock<ceph::mutex>* locker) {
+  if (m_state == STATE_COMPLETE) {
+    locker->unlock();
+
+    return true;
+  }
+
+  return false;
+}
+
 template <typename I>
 void Replayer<I>::schedule_load_group_snapshots() {
   dout(10) << dendl;
@@ -195,6 +212,10 @@ template <typename I>
 void Replayer<I>::load_local_group_snapshots() {
   dout(10) << "m_local_group_id=" << m_local_group_id << dendl;
 
+  if (is_replay_interrupted()) {
+    return;
+  }
+
   if (m_state != STATE_COMPLETE) {
     m_state = STATE_REPLAYING;
   }
@@ -258,6 +279,9 @@ void Replayer<I>::load_remote_group_snapshots() {
   dout(10) << "m_remote_group_id=" << m_remote_group_id << dendl;
 
   std::unique_lock locker{m_lock};
+  if (is_replay_interrupted(&locker)) {
+    return;
+  }
   m_remote_group_snaps.clear();
   auto ctx = new LambdaContext(
     [this] (int r) {
@@ -311,6 +335,9 @@ template <typename I>
 void Replayer<I>::validate_image_snaps_sync_complete(
     const std::string &remote_group_snap_id) {
   std::unique_lock locker{m_lock};
+  if (is_replay_interrupted(&locker)) {
+    return;
+  }
   // 1. get group membership
   // 2. get snap list of each image and check any image snap has the group
   // snapid and is set to complete. If yes call complete
@@ -437,7 +464,12 @@ void Replayer<I>::scan_for_unsynced_group_snapshots() {
 
   bool found = false;
   bool syncs_upto_date = false;
+
   std::unique_lock locker{m_lock};
+  if (is_replay_interrupted(&locker)) {
+    return;
+  }
+
   if (m_remote_group_snaps.empty()) {
     goto out;
   }
@@ -545,6 +577,9 @@ template <typename I>
 void Replayer<I>::try_create_group_snapshot(cls::rbd::GroupSnapshot snap,
                                             std::unique_lock<ceph::mutex> &locker) {
   dout(10) << snap.id << dendl;
+  if (is_replay_interrupted(&locker)) {
+    return;
+  }
   ceph_assert(ceph_mutex_is_locked_by_me(m_lock));
 
   auto snap_type = cls::rbd::get_group_snap_namespace_type(
@@ -874,8 +909,6 @@ void Replayer<I>::handle_create_regular_snapshot(
          << cpp_strerror(r) << dendl;
   }
   on_finish->complete(0);
-
-  schedule_load_group_snapshots();
 }
 
 template <typename I>
index cef4e9a5fa55a8aae45b83aa0402eefd460f0193..e9c87115afb37114866838b3140d840695dc02fd 100644 (file)
@@ -106,6 +106,8 @@ private:
   // map of <group_snap_id, vec<pair<cls::rbd::ImageSnapshotSpec, bool>>>
   std::map<std::string, std::vector<std::pair<cls::rbd::ImageSnapshotSpec, bool>>> m_pending_group_snaps;
 
+  bool is_replay_interrupted();
+  bool is_replay_interrupted(std::unique_lock<ceph::mutex>* locker);
   int local_group_image_list_by_id(
       std::vector<cls::rbd::GroupImageStatus> *image_ids);