From bcc2653783bddf4cc14a8b0f85f5248d65ddb6dd Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Tue, 31 Dec 2019 09:57:15 +0000 Subject: [PATCH] rbd-mirror: reopen all contexts logs on SIGHUP Signed-off-by: Mykola Golub (cherry picked from commit 9ddf111506611a596c713ffe861a41aeda05e7a5) Conflicts: src/tools/rbd_mirror/Mirror.cc (std::lock_guard vs Mutex::Locker) src/tools/rbd_mirror/PoolReplayer.cc (std::lock_guard vs Mutex::Locker) --- src/tools/rbd_mirror/Mirror.cc | 24 +++++++++++++++++++++--- src/tools/rbd_mirror/PoolReplayer.cc | 15 +++++++++++++++ src/tools/rbd_mirror/PoolReplayer.h | 1 + src/tools/rbd_mirror/main.cc | 4 ++-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/tools/rbd_mirror/Mirror.cc b/src/tools/rbd_mirror/Mirror.cc index 144386cb47a7b..be4a5503ecdff 100644 --- a/src/tools/rbd_mirror/Mirror.cc +++ b/src/tools/rbd_mirror/Mirror.cc @@ -1,6 +1,8 @@ // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab +#include + #include #include "common/Formatter.h" @@ -217,10 +219,26 @@ Mirror::~Mirror() void Mirror::handle_signal(int signum) { - m_stopping = true; - { - Mutex::Locker l(m_lock); + dout(20) << signum << dendl; + + Mutex::Locker l(m_lock); + + switch (signum) { + case SIGHUP: + for (auto &it : m_pool_replayers) { + it.second->reopen_logs(); + } + g_ceph_context->reopen_logs(); + break; + + case SIGINT: + case SIGTERM: + m_stopping = true; m_cond.Signal(); + break; + + default: + ceph_abort_msgf("unexpected signal %d", signum); } } diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index ecf406ec27783..ac3463256704a 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -272,6 +272,8 @@ bool PoolReplayer::is_running() const { template void PoolReplayer::init() { + Mutex::Locker l(m_lock); + ceph_assert(!m_pool_replayer_thread.is_started()); // reset state @@ -564,6 +566,19 @@ void PoolReplayer::run() m_instance_replayer->stop(); } +template +void PoolReplayer::reopen_logs() +{ + Mutex::Locker l(m_lock); + + if (m_local_rados) { + reinterpret_cast(m_local_rados->cct())->reopen_logs(); + } + if (m_remote_rados) { + reinterpret_cast(m_remote_rados->cct())->reopen_logs(); + } +} + template void PoolReplayer::print_status(Formatter *f, stringstream *ss) { diff --git a/src/tools/rbd_mirror/PoolReplayer.h b/src/tools/rbd_mirror/PoolReplayer.h index ef6d827645283..43a4a0fc34c49 100644 --- a/src/tools/rbd_mirror/PoolReplayer.h +++ b/src/tools/rbd_mirror/PoolReplayer.h @@ -69,6 +69,7 @@ public: void restart(); void flush(); void release_leader(); + void reopen_logs(); private: /** diff --git a/src/tools/rbd_mirror/main.cc b/src/tools/rbd_mirror/main.cc index 8a5111e3aec60..ab350a014cf80 100644 --- a/src/tools/rbd_mirror/main.cc +++ b/src/tools/rbd_mirror/main.cc @@ -56,7 +56,7 @@ int main(int argc, const char **argv) common_init_finish(g_ceph_context); init_async_signal_handler(); - register_async_signal_handler(SIGHUP, sighup_handler); + register_async_signal_handler(SIGHUP, handle_signal); register_async_signal_handler_oneshot(SIGINT, handle_signal); register_async_signal_handler_oneshot(SIGTERM, handle_signal); @@ -90,7 +90,7 @@ int main(int argc, const char **argv) mirror->run(); cleanup: - unregister_async_signal_handler(SIGHUP, sighup_handler); + 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