]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephfs-mirror: complete context when a mirror instance is not failed or blocklisted
authorVenky Shankar <vshankar@redhat.com>
Thu, 15 Jul 2021 11:26:38 +0000 (07:26 -0400)
committerVenky Shankar <vshankar@redhat.com>
Fri, 23 Jul 2021 05:12:55 +0000 (01:12 -0400)
Without this, the updater thread can start processing othere queued
contexts when a mirror instance is failed or blocklisted resulting
in unexpected behavior.

Signed-off-by: Venky Shankar <vshankar@redhat.com>
(cherry picked from commit c49024c90a1da7905c491897ea26e8bbc8942186)

src/tools/cephfs_mirror/Mirror.cc

index a4d7742df0f08c6ae0d4dcb3ac4ae896e07db3ad..efaa27106e51da94863bae15c4910c781c379202 100644 (file)
@@ -506,24 +506,26 @@ void Mirror::update_fs_mirrors() {
   {
     std::scoped_lock locker(m_lock);
     for (auto &[filesystem, mirror_action] : m_mirror_actions) {
-      if (check_failure && !mirror_action.action_in_progress &&
-          mirror_action.fs_mirror && mirror_action.fs_mirror->is_failed()) {
+      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) {
         // about to restart failed mirror instance -- nothing
         // should interfere
         dout(5) << ": filesystem=" << filesystem << " failed mirroring -- restarting" << dendl;
         auto peers = mirror_action.fs_mirror->get_peers();
-        mirror_action.action_ctxs.push_front(
-          new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers));
-      } else if (check_blocklist && !mirror_action.action_in_progress &&
-                 mirror_action.fs_mirror && mirror_action.fs_mirror->is_blocklisted()) {
+        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) {
         // about to restart blocklisted mirror instance -- nothing
         // should interfere
         dout(5) << ": filesystem=" << filesystem << " is blocklisted -- restarting" << dendl;
         auto peers = mirror_action.fs_mirror->get_peers();
-        mirror_action.action_ctxs.push_front(
-          new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers));
+        auto ctx = new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers);
+        ctx->complete(0);
       }
-      if (!mirror_action.action_ctxs.empty() && !mirror_action.action_in_progress) {
+      if (!failed && !blocklisted && !mirror_action.action_ctxs.empty()
+          && !mirror_action.action_in_progress) {
         auto ctx = std::move(mirror_action.action_ctxs.front());
         mirror_action.action_ctxs.pop_front();
         ctx->complete(0);