]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: invoke plugin shutdown on SIG{TERM,INT} signals. 30890/head
authorVenky Shankar <vshankar@redhat.com>
Mon, 14 Oct 2019 10:51:03 +0000 (06:51 -0400)
committerVenky Shankar <vshankar@redhat.com>
Thu, 24 Oct 2019 07:34:44 +0000 (03:34 -0400)
Mgr standby used to install signals handler but did pretty
much nothing when signals were received. Move the signal
handling part to Mgr core so as to invoke plugin shutdowns
when ceph-mgr received SIGTERM or SIGINT.

Fixes: http://tracker.ceph.com/issues/42299
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/mgr/Mgr.cc
src/mgr/Mgr.h
src/mgr/MgrStandby.cc
src/mgr/MgrStandby.h

index 27f74f2b06e8278cf97e7b326d335627a50a74ca..a10746a2cfb9023502b6a69bbcf9b5216d458f0d 100644 (file)
@@ -219,12 +219,35 @@ std::map<std::string, std::string> Mgr::load_store()
   return loaded;
 }
 
+void Mgr::handle_signal(int signum)
+{
+  ceph_assert(signum == SIGINT || signum == SIGTERM);
+  derr << "*** Got signal " << sig_str(signum) << " ***" << dendl;
+  shutdown();
+  _exit(0);  // exit with 0 result code, as if we had done an orderly shutdown
+}
+
+// A reference for use by the signal handler
+static Mgr *signal_mgr = nullptr;
+
+static void handle_mgr_signal(int signum)
+{
+  if (signal_mgr) {
+    signal_mgr->handle_signal(signum);
+  }
+}
+
 void Mgr::init()
 {
   std::unique_lock l(lock);
   ceph_assert(initializing);
   ceph_assert(!initialized);
 
+  // Enable signal handlers
+  signal_mgr = this;
+  register_async_signal_handler_oneshot(SIGINT, handle_mgr_signal);
+  register_async_signal_handler_oneshot(SIGTERM, handle_mgr_signal);
+
   // Start communicating with daemons to learn statistics etc
   int r = server.init(monc->get_global_id(), client_messenger->get_myaddrs());
   if (r < 0) {
@@ -395,6 +418,7 @@ void Mgr::load_all_metadata()
 
 void Mgr::shutdown()
 {
+  dout(10) << "mgr shutdown init" << dendl;
   finisher.queue(new LambdaContext([&](int) {
     {
       std::lock_guard l(lock);
index 85b1137fe0ff224bca12eb4c264c8e35b20a6659..d38a75cac931f8c7f492050b70715a8d6cf04173 100644 (file)
@@ -94,6 +94,8 @@ public:
   void background_init(Context *completion);
   void shutdown();
 
+  void handle_signal(int signum);
+
   std::map<std::string, std::string> get_services() const;
 };
 
index 7d193b6575b928aea7e201b0ac011786c17f55c0..b021a1829715efe43da75f23f0d0194523408bad 100644 (file)
@@ -259,14 +259,6 @@ void MgrStandby::tick()
   )); 
 }
 
-void MgrStandby::handle_signal(int signum)
-{
-  ceph_assert(signum == SIGINT || signum == SIGTERM);
-  derr << "*** Got signal " << sig_str(signum) << " ***" << dendl;
-  _exit(0);  // exit with 0 result code, as if we had done an orderly shutdown
-  //shutdown();
-}
-
 void MgrStandby::shutdown()
 {
   finisher.queue(new LambdaContext([&](int) {
@@ -458,31 +450,13 @@ bool MgrStandby::ms_handle_refused(Connection *con)
   return false;
 }
 
-// A reference for use by the signal handler
-static MgrStandby *signal_mgr = nullptr;
-
-static void handle_mgr_signal(int signum)
-{
-  if (signal_mgr) {
-    signal_mgr->handle_signal(signum);
-  }
-}
-
 int MgrStandby::main(vector<const char *> args)
 {
-  // Enable signal handlers
-  signal_mgr = this;
-  register_async_signal_handler_oneshot(SIGINT, handle_mgr_signal);
-  register_async_signal_handler_oneshot(SIGTERM, handle_mgr_signal);
-
   client_messenger->wait();
 
   // Disable signal handlers
   unregister_async_signal_handler(SIGHUP, sighup_handler);
-  unregister_async_signal_handler(SIGINT, handle_mgr_signal);
-  unregister_async_signal_handler(SIGTERM, handle_mgr_signal);
   shutdown_async_signal_handler();
-  signal_mgr = nullptr;
 
   return 0;
 }
index 98b9d0d22a787e297359337f28182d0ac4a660ed..d79fef2d5e577cab03c295f00a3e2f7426253a30 100644 (file)
@@ -80,7 +80,6 @@ public:
   void shutdown();
   void respawn();
   int main(vector<const char *> args);
-  void handle_signal(int signum);
   void tick();
 };