From 208ad8d22fcd5e7da3a6f67205cd3f0ba7eb62fb Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 2 Aug 2023 01:37:58 -0400 Subject: [PATCH] cephfs-mirror: do not run concurrent C_RestartMirroring context Fixes: http://tracker.ceph.com/issues/62072 Signed-off-by: Venky Shankar (cherry picked from commit b4d8f99c2aaef3b3dd74a4840c21dcb3ca9eb81a) --- src/tools/cephfs_mirror/Mirror.cc | 9 +++++++-- src/tools/cephfs_mirror/Mirror.h | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/tools/cephfs_mirror/Mirror.cc b/src/tools/cephfs_mirror/Mirror.cc index 890805764c0..2b108f9f9fd 100644 --- a/src/tools/cephfs_mirror/Mirror.cc +++ b/src/tools/cephfs_mirror/Mirror.cc @@ -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); diff --git a/src/tools/cephfs_mirror/Mirror.h b/src/tools/cephfs_mirror/Mirror.h index f0ffdd51625..74fe5f4d8d3 100644 --- a/src/tools/cephfs_mirror/Mirror.h +++ b/src/tools/cephfs_mirror/Mirror.h @@ -77,6 +77,7 @@ private: uint64_t pool_id; // for restarting blocklisted mirror instance bool action_in_progress = false; + bool restarting = false; std::list action_ctxs; std::unique_ptr 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 -- 2.39.5