]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: reopen all contexts logs on SIGHUP
authorMykola Golub <mgolub@suse.com>
Tue, 31 Dec 2019 09:57:15 +0000 (09:57 +0000)
committerMykola Golub <mgolub@suse.com>
Fri, 10 Jan 2020 12:00:41 +0000 (12:00 +0000)
Signed-off-by: Mykola Golub <mgolub@suse.com>
(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
src/tools/rbd_mirror/PoolReplayer.cc
src/tools/rbd_mirror/PoolReplayer.h
src/tools/rbd_mirror/main.cc

index 144386cb47a7be706cc6aad2bb60bd7812efaef3..be4a5503ecdffd78de9872d877bbbbfb36613d3c 100644 (file)
@@ -1,6 +1,8 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
 // vim: ts=8 sw=2 smarttab
 
+#include <signal.h>
+
 #include <boost/range/adaptor/map.hpp>
 
 #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);
   }
 }
 
index ecf406ec277835ce466f5390bbddabf2f184796d..ac3463256704a9f95fa67ac953b53fb9a5823f8d 100644 (file)
@@ -272,6 +272,8 @@ bool PoolReplayer<I>::is_running() const {
 template <typename I>
 void PoolReplayer<I>::init()
 {
+  Mutex::Locker l(m_lock);
+
   ceph_assert(!m_pool_replayer_thread.is_started());
 
   // reset state
@@ -564,6 +566,19 @@ void PoolReplayer<I>::run()
   m_instance_replayer->stop();
 }
 
+template <typename I>
+void PoolReplayer<I>::reopen_logs()
+{
+  Mutex::Locker l(m_lock);
+
+  if (m_local_rados) {
+    reinterpret_cast<CephContext *>(m_local_rados->cct())->reopen_logs();
+  }
+  if (m_remote_rados) {
+    reinterpret_cast<CephContext *>(m_remote_rados->cct())->reopen_logs();
+  }
+}
+
 template <typename I>
 void PoolReplayer<I>::print_status(Formatter *f, stringstream *ss)
 {
index ef6d8276452831ebde86d36f97f52923e6dae753..43a4a0fc34c49951326967c976dd6ca558353056 100644 (file)
@@ -69,6 +69,7 @@ public:
   void restart();
   void flush();
   void release_leader();
+  void reopen_logs();
 
 private:
   /**
index 8a5111e3aec60610facd563479024815479c9356..ab350a014cf8030e254f49543a3e76c35598aa99 100644 (file)
@@ -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();