]> 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>
Sun, 5 Jan 2020 09:30:00 +0000 (09:30 +0000)
Signed-off-by: Mykola Golub <mgolub@suse.com>
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 1a6604484f47417d21344503cefd104392ba46ba..787c6980ecfce88ff9d2b801f3c67812dd8666b1 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"
@@ -498,10 +500,26 @@ Mirror::~Mirror()
 
 void Mirror::handle_signal(int signum)
 {
-  m_stopping = true;
-  {
-    std::lock_guard l{m_lock};
+  dout(20) << signum << dendl;
+
+  std::lock_guard 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.notify_all();
+    break;
+
+  default:
+    ceph_abort_msgf("unexpected signal %d", signum);
   }
 }
 
index 0447289797fe6d607f9256a1b840dbdf2557f137..30a312aad152616ed6b9e240cdf5930ff6add70c 100644 (file)
@@ -248,6 +248,8 @@ bool PoolReplayer<I>::is_running() const {
 
 template <typename I>
 void PoolReplayer<I>::init(const std::string& site_name) {
+  std::lock_guard locker{m_lock};
+
   ceph_assert(!m_pool_replayer_thread.is_started());
 
   // reset state
@@ -697,6 +699,19 @@ int PoolReplayer<I>::list_mirroring_namespaces(
   return 0;
 }
 
+template <typename I>
+void PoolReplayer<I>::reopen_logs()
+{
+  std::lock_guard locker{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>::namespace_replayer_acquire_leader(const std::string &name,
                                                         Context *on_finish) {
index 312de1f443999fbfb57e39a871c848f8aeed4cad..9f295f4788caffd4e3ba65e3919c9f85d9369615 100644 (file)
@@ -64,6 +64,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();