]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephfs-mirror: do not run concurrent C_RestartMirroring context
authorVenky Shankar <vshankar@redhat.com>
Wed, 2 Aug 2023 05:37:58 +0000 (01:37 -0400)
committerVenky Shankar <vshankar@redhat.com>
Mon, 25 Sep 2023 07:03:03 +0000 (12:33 +0530)
Fixes: http://tracker.ceph.com/issues/62072
Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit b4d8f99c2aaef3b3dd74a4840c21dcb3ca9eb81a)

src/tools/cephfs_mirror/Mirror.cc
src/tools/cephfs_mirror/Mirror.h

index 890805764c048d86ecb26c817add6aaaf6e5d9af..2b108f9f9fd43b865da070f9f5f5e270c47178db 100644 (file)
@@ -179,6 +179,7 @@ struct Mirror::C_RestartMirroring : Context {
 
   void handle_enable_mirroring(int r) {
     mirror->handle_enable_mirroring(filesystem, peers, r);
+    mirror->_unset_restarting(filesystem);
     delete this;
   }
 
@@ -509,16 +510,20 @@ void Mirror::update_fs_mirrors() {
       auto failed = mirror_action.fs_mirror && mirror_action.fs_mirror->is_failed();
       auto blocklisted = mirror_action.fs_mirror && mirror_action.fs_mirror->is_blocklisted();
 
-      if (check_failure && !mirror_action.action_in_progress && failed) {
+      if (check_failure && !mirror_action.action_in_progress &&
+         !_is_restarting(filesystem) && failed) {
         // about to restart failed mirror instance -- nothing
         // should interfere
         dout(5) << ": filesystem=" << filesystem << " failed mirroring -- restarting" << dendl;
+       _set_restarting(filesystem);
         auto peers = mirror_action.fs_mirror->get_peers();
         auto ctx =  new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers);
         ctx->complete(0);
-      } else if (check_blocklist && !mirror_action.action_in_progress && blocklisted) {
+      } else if (check_blocklist && !mirror_action.action_in_progress &&
+                !_is_restarting(filesystem) && blocklisted) {
         // about to restart blocklisted mirror instance -- nothing
         // should interfere
+       _set_restarting(filesystem);
         dout(5) << ": filesystem=" << filesystem << " is blocklisted -- restarting" << dendl;
         auto peers = mirror_action.fs_mirror->get_peers();
         auto ctx = new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers);
index f0ffdd51625625dfb41be76110254a5f973d2573..74fe5f4d8d31b179d0a6b85f1f589ef738a798d3 100644 (file)
@@ -77,6 +77,7 @@ private:
 
     uint64_t pool_id; // for restarting blocklisted mirror instance
     bool action_in_progress = false;
+    bool restarting = false;
     std::list<Context *> action_ctxs;
     std::unique_ptr<FSMirror> fs_mirror;
   };
@@ -132,6 +133,21 @@ private:
   void update_fs_mirrors();
 
   void reopen_logs();
+
+  void _set_restarting(const Filesystem &filesystem) {
+    auto &mirror_action = m_mirror_actions.at(filesystem);
+    mirror_action.restarting = true;
+  }
+
+  void _unset_restarting(const Filesystem &filesystem) {
+    auto &mirror_action = m_mirror_actions.at(filesystem);
+    mirror_action.restarting = false;
+  }
+
+  bool _is_restarting(const Filesystem &filesystem) {
+    auto &mirror_action = m_mirror_actions.at(filesystem);
+    return mirror_action.restarting;
+  }
 };
 
 } // namespace mirror