From 68ad416766e2c73109dbf44f179d1b85b9d61994 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Wed, 23 Jun 2021 02:59:13 -0400 Subject: [PATCH] cephfs-mirror: reopen logs on SIGHUP Signed-off-by: Venky Shankar --- src/tools/cephfs_mirror/FSMirror.cc | 11 +++++++++++ src/tools/cephfs_mirror/FSMirror.h | 2 ++ src/tools/cephfs_mirror/Mirror.cc | 24 ++++++++++++++++++++---- src/tools/cephfs_mirror/Mirror.h | 2 ++ src/tools/cephfs_mirror/PeerReplayer.cc | 8 ++++++++ src/tools/cephfs_mirror/PeerReplayer.h | 3 +++ src/tools/cephfs_mirror/main.cc | 2 ++ 7 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/tools/cephfs_mirror/FSMirror.cc b/src/tools/cephfs_mirror/FSMirror.cc index d18a1563fbe..76dcc11f6c6 100644 --- a/src/tools/cephfs_mirror/FSMirror.cc +++ b/src/tools/cephfs_mirror/FSMirror.cc @@ -136,6 +136,17 @@ void FSMirror::cleanup() { m_cluster.reset(); } +void FSMirror::reopen_logs() { + std::scoped_lock locker(m_lock); + + if (m_cluster) { + reinterpret_cast(m_cluster->cct())->reopen_logs(); + } + for (auto &[peer, replayer] : m_peer_replayers) { + replayer->reopen_logs(); + } +} + void FSMirror::init(Context *on_finish) { dout(20) << dendl; diff --git a/src/tools/cephfs_mirror/FSMirror.h b/src/tools/cephfs_mirror/FSMirror.h index e598cd12d5d..bae5a38e1b5 100644 --- a/src/tools/cephfs_mirror/FSMirror.h +++ b/src/tools/cephfs_mirror/FSMirror.h @@ -70,6 +70,8 @@ public: // admin socket helpers void mirror_status(Formatter *f); + void reopen_logs(); + private: bool is_blocklisted(const std::scoped_lock &locker) const { bool blocklisted = false; diff --git a/src/tools/cephfs_mirror/Mirror.cc b/src/tools/cephfs_mirror/Mirror.cc index 9389c77f1cf..a4d7742df0f 100644 --- a/src/tools/cephfs_mirror/Mirror.cc +++ b/src/tools/cephfs_mirror/Mirror.cc @@ -284,16 +284,32 @@ int Mirror::init(std::string &reason) { void Mirror::shutdown() { dout(20) << dendl; - - std::unique_lock locker(m_lock); m_stopping = true; m_cond.notify_all(); } +void Mirror::reopen_logs() { + for (auto &[filesystem, mirror_action] : m_mirror_actions) { + mirror_action.fs_mirror->reopen_logs(); + } + g_ceph_context->reopen_logs(); +} + void Mirror::handle_signal(int signum) { dout(10) << ": signal=" << signum << dendl; - ceph_assert(signum == SIGTERM || signum == SIGINT); - shutdown(); + + std::scoped_lock locker(m_lock); + switch (signum) { + case SIGHUP: + reopen_logs(); + break; + case SIGINT: + case SIGTERM: + shutdown(); + break; + default: + ceph_abort_msgf("unexpected signal %d", signum); + } } void Mirror::handle_enable_mirroring(const Filesystem &filesystem, diff --git a/src/tools/cephfs_mirror/Mirror.h b/src/tools/cephfs_mirror/Mirror.h index 2e50a2a8bdb..f0ffdd51625 100644 --- a/src/tools/cephfs_mirror/Mirror.h +++ b/src/tools/cephfs_mirror/Mirror.h @@ -130,6 +130,8 @@ private: void schedule_mirror_update_task(); void update_fs_mirrors(); + + void reopen_logs(); }; } // namespace mirror diff --git a/src/tools/cephfs_mirror/PeerReplayer.cc b/src/tools/cephfs_mirror/PeerReplayer.cc index ac0b10ba54c..6c2e6ee5b88 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.cc +++ b/src/tools/cephfs_mirror/PeerReplayer.cc @@ -1540,5 +1540,13 @@ void PeerReplayer::peer_status(Formatter *f) { f->close_section(); // stats } +void PeerReplayer::reopen_logs() { + std::scoped_lock locker(m_lock); + + if (m_remote_cluster) { + reinterpret_cast(m_remote_cluster->cct())->reopen_logs(); + } +} + } // namespace mirror } // namespace cephfs diff --git a/src/tools/cephfs_mirror/PeerReplayer.h b/src/tools/cephfs_mirror/PeerReplayer.h index ff78db836ed..f3206427869 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.h +++ b/src/tools/cephfs_mirror/PeerReplayer.h @@ -39,6 +39,9 @@ public: // admin socket helpers void peer_status(Formatter *f); + // reopen logs + void reopen_logs(); + private: inline static const std::string PRIMARY_SNAP_ID_KEY = "primary_snap_id"; diff --git a/src/tools/cephfs_mirror/main.cc b/src/tools/cephfs_mirror/main.cc index f23e1992456..efaa89c3593 100644 --- a/src/tools/cephfs_mirror/main.cc +++ b/src/tools/cephfs_mirror/main.cc @@ -77,6 +77,7 @@ int main(int argc, const char **argv) { } init_async_signal_handler(); + register_async_signal_handler(SIGHUP, handle_signal); register_async_signal_handler_oneshot(SIGINT, handle_signal); register_async_signal_handler_oneshot(SIGTERM, handle_signal); @@ -114,6 +115,7 @@ cleanup_messenger: msgr->wait(); delete msgr; + unregister_async_signal_handler(SIGHUP, handle_signal); unregister_async_signal_handler(SIGINT, handle_signal); unregister_async_signal_handler(SIGTERM, handle_signal); shutdown_async_signal_handler(); -- 2.39.5