From 3c6cfa9267e02d1e298396f31b8fe5cda68b97ad 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, PoolReplayer is not a template) --- src/tools/rbd_mirror/Mirror.cc | 24 +++++++++++++++++++++--- src/tools/rbd_mirror/PoolReplayer.cc | 14 ++++++++++++++ src/tools/rbd_mirror/PoolReplayer.h | 1 + src/tools/rbd_mirror/main.cc | 4 ++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/tools/rbd_mirror/Mirror.cc b/src/tools/rbd_mirror/Mirror.cc index 61dc9bf2d89c7..4ba547eeb1a07 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" @@ -216,10 +218,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 f48c1bc913b2a..26e568140a102 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -254,6 +254,8 @@ bool PoolReplayer::is_running() const { void PoolReplayer::init() { + Mutex::Locker l(m_lock); + assert(!m_pool_replayer_thread.is_started()); // reset state @@ -513,6 +515,18 @@ void PoolReplayer::run() m_instance_replayer->stop(); } +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(); + } +} + void PoolReplayer::print_status(Formatter *f, stringstream *ss) { dout(20) << "enter" << dendl; diff --git a/src/tools/rbd_mirror/PoolReplayer.h b/src/tools/rbd_mirror/PoolReplayer.h index 9a581756d5e44..cf657dc097d96 100644 --- a/src/tools/rbd_mirror/PoolReplayer.h +++ b/src/tools/rbd_mirror/PoolReplayer.h @@ -64,6 +64,7 @@ public: void restart(); void flush(); void release_leader(); + void reopen_logs(); private: struct PoolWatcherListener : public PoolWatcher<>::Listener { diff --git a/src/tools/rbd_mirror/main.cc b/src/tools/rbd_mirror/main.cc index a423555eac9a0..bb3b0cd42ad61 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