]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: install async signal handlers for SIG{HUP,INT,TERM}
authorSage Weil <sage.weil@dreamhost.com>
Sun, 12 Feb 2012 00:38:06 +0000 (16:38 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Wed, 15 Feb 2012 05:03:53 +0000 (21:03 -0800)
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/ceph_mon.cc
src/mon/Monitor.cc
src/mon/Monitor.h
src/osd/OSD.cc

index 585a1e4164e4dbf8b92ea991be8b5d987d553e6b..877fd60a20e64ca4b6e38108f4a9bcf9640bced9 100644 (file)
@@ -39,9 +39,18 @@ using namespace std;
 #include "common/errno.h"
 
 #include "global/global_init.h"
+#include "global/signal_handler.h"
 
 extern CompatSet get_ceph_mon_feature_compat_set();
 
+Monitor *mon = NULL;
+
+void handle_mon_signal(int signum)
+{
+  if (mon)
+    mon->handle_signal(signum);
+}
+
 void usage()
 {
   cerr << "usage: ceph-mon -i monid [--mon-data=pathtodata] [flags]" << std::endl;
@@ -377,13 +386,19 @@ int main(int argc, const char **argv)
   // start monitor
   messenger->register_entity(entity_name_t::MON(rank));
   messenger->set_default_send_priority(CEPH_MSG_PRIO_HIGH);
-  Monitor *mon = new Monitor(g_ceph_context, g_conf->name.get_id(), &store, messenger, &monmap);
+  mon = new Monitor(g_ceph_context, g_conf->name.get_id(), &store, messenger, &monmap);
 
   global_init_daemonize(g_ceph_context, 0);
   common_init_finish(g_ceph_context);
   global_init_chdir(g_ceph_context);
   messenger->start();
 
+  // set up signal handlers, now that we've daemonized/forked.
+  init_async_signal_handler();
+  register_async_signal_handler(SIGHUP, sighup_handler);
+  register_async_signal_handler(SIGINT, handle_mon_signal);
+  register_async_signal_handler(SIGTERM, handle_mon_signal);
+
   uint64_t supported =
     CEPH_FEATURE_UID |
     CEPH_FEATURE_NOSRCADDR |
index 11bce19d896ac71eadacaeebde6ddb4844c891f5..87e774908365edc87916c9f07940750336986eb1 100644 (file)
@@ -216,6 +216,15 @@ void Monitor::do_admin_command(string command, ostream& ss)
     assert(0 == "bad AdminSocket command binding");
 }
 
+void Monitor::handle_signal(int signum)
+{
+  assert(signum == SIGINT || signum == SIGTERM);
+  derr << "*** got signal " << sys_siglist[signum] << " ***" << dendl;
+
+  // FIXME
+  exit(1);
+}
+
 void Monitor::init()
 {
   lock.Lock();
index ae229ac2ee2f0a112b2377569db121b0f5c19275..6d0ed691c39dbb321a58afdc45c1a58598dde9eb 100644 (file)
@@ -334,6 +334,8 @@ public:
   void shutdown();
   void tick();
 
+  void handle_signal(int sig);
+
   void stop_cluster();
 
   int mkfs(bufferlist& osdmapbl);
index 8a7c3a7d7e3a75bfd0d7796dc2014a33445f5e14..40cd2ac699d67e4ae2a57b94cb3244441fa961a8 100644 (file)
@@ -603,7 +603,7 @@ void OSD::handle_signal(int signum)
   derr << "*** got signal " << sys_siglist[signum] << " ***" << dendl;
 
   // FIXME!
-  exit(0);
+  exit(1);
 }
 
 int OSD::pre_init()