From e07615f244169a2dff912375af8671ee73c7d5fa 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, ceph_abort_msgf does not exist) 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 bc8de0103e849..eb5532211bc12 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(); } } diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index e9c3991970dbe..995fdc2bda6d1 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -270,6 +270,8 @@ bool PoolReplayer::is_running() const { template void PoolReplayer::init() { + Mutex::Locker l(m_lock); + assert(!m_pool_replayer_thread.is_started()); // reset state @@ -534,6 +536,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 e15d183725f11..fc162949afc48 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 84d7a9de6a46f..8bc86d73f00d2 100644 --- a/src/tools/rbd_mirror/main.cc +++ b/src/tools/rbd_mirror/main.cc @@ -54,7 +54,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); @@ -74,7 +74,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