]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: install admin socket commands after signals
authorSage Weil <sage@inktank.com>
Sat, 24 Aug 2013 21:04:09 +0000 (14:04 -0700)
committerSage Weil <sage@inktank.com>
Tue, 27 Aug 2013 16:41:41 +0000 (09:41 -0700)
This lets us tell by the presence of the admin socket commands whether
a signal will make us shut down cleanly.  See #5924.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit c5b5ce120a8ce9116be52874dbbcc39adec48b5c)

src/ceph_osd.cc
src/osd/OSD.cc
src/osd/OSD.h

index d8590bff8175529dd7c9b7626f9fcd05ea7dee61..dc6f435bdcfc304ecb468fa460934abc3ede0f25 100644 (file)
@@ -465,6 +465,8 @@ int main(int argc, const char **argv)
   register_async_signal_handler_oneshot(SIGINT, handle_osd_signal);
   register_async_signal_handler_oneshot(SIGTERM, handle_osd_signal);
 
+  osd->final_init();
+
   if (g_conf->inject_early_sigterm)
     kill(getpid(), SIGTERM);
 
index 1a77dae730ab7ba8f1e28aac91a1eb258ad708ea..f1ae117e91af09a61ac619f65ba6cef6f3cb36d7 100644 (file)
@@ -1225,6 +1225,44 @@ int OSD::init()
   // tick
   tick_timer.add_event_after(g_conf->osd_heartbeat_interval, new C_Tick(this));
 
+  service.init();
+  service.publish_map(osdmap);
+  service.publish_superblock(superblock);
+
+  osd_lock.Unlock();
+
+  r = monc->authenticate();
+  if (r < 0) {
+    monc->shutdown();
+    store->umount();
+    osd_lock.Lock(); // locker is going to unlock this on function exit
+    if (is_stopping())
+      return 0;
+    return r;
+  }
+
+  while (monc->wait_auth_rotating(30.0) < 0) {
+    derr << "unable to obtain rotating service keys; retrying" << dendl;
+  }
+
+  osd_lock.Lock();
+  if (is_stopping())
+    return 0;
+
+  dout(10) << "ensuring pgs have consumed prior maps" << dendl;
+  consume_map();
+  peering_wq.drain();
+
+  dout(10) << "done with init, starting boot process" << dendl;
+  state = STATE_BOOTING;
+  start_boot();
+
+  return 0;
+}
+
+void OSD::final_init()
+{
+  int r;
   AdminSocket *admin_socket = cct->get_admin_socket();
   asok_hook = new OSDSocketHook(this);
   r = admin_socket->register_command("dump_ops_in_flight",
@@ -1317,40 +1355,6 @@ int OSD::init()
     test_ops_hook,
     "inject metadata error");
   assert(r == 0);
-
-  service.init();
-  service.publish_map(osdmap);
-  service.publish_superblock(superblock);
-
-  osd_lock.Unlock();
-
-  r = monc->authenticate();
-  if (r < 0) {
-    monc->shutdown();
-    store->umount();
-    osd_lock.Lock(); // locker is going to unlock this on function exit
-    if (is_stopping())
-      return 0;
-    return r;
-  }
-
-  while (monc->wait_auth_rotating(30.0) < 0) {
-    derr << "unable to obtain rotating service keys; retrying" << dendl;
-  }
-
-  osd_lock.Lock();
-  if (is_stopping())
-    return 0;
-
-  dout(10) << "ensuring pgs have consumed prior maps" << dendl;
-  consume_map();
-  peering_wq.drain();
-
-  dout(10) << "done with init, starting boot process" << dendl;
-  state = STATE_BOOTING;
-  start_boot();
-
-  return 0;
 }
 
 void OSD::create_logger()
index 82a251d9a80a6d88b80fd308f686dcc38b40908e..c6ee04fd7100de3868fc5fb6e4953881a2d5863a 100644 (file)
@@ -1681,6 +1681,7 @@ public:
   // startup/shutdown
   int pre_init();
   int init();
+  void final_init();
 
   void suicide(int exitcode);
   int shutdown();