From: Venky Shankar Date: Thu, 15 Jul 2021 11:26:38 +0000 (-0400) Subject: cephfs-mirror: complete context when a mirror instance is not failed or blocklisted X-Git-Tag: v16.2.6~119^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b0fe2a59c3f2c481a45dd047cee9028f589ff0bc;p=ceph.git cephfs-mirror: complete context when a mirror instance is not failed or blocklisted 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 (cherry picked from commit c49024c90a1da7905c491897ea26e8bbc8942186) --- diff --git a/src/tools/cephfs_mirror/Mirror.cc b/src/tools/cephfs_mirror/Mirror.cc index a4d7742df0f0..efaa27106e51 100644 --- a/src/tools/cephfs_mirror/Mirror.cc +++ b/src/tools/cephfs_mirror/Mirror.cc @@ -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);