From: Sage Weil Date: Sat, 24 Aug 2013 21:04:09 +0000 (-0700) Subject: osd: install admin socket commands after signals X-Git-Tag: v0.68~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c5b5ce120a8ce9116be52874dbbcc39adec48b5c;p=ceph.git osd: install admin socket commands after signals 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 Reviewed-by: Samuel Just --- diff --git a/src/ceph_osd.cc b/src/ceph_osd.cc index d8590bff817..dc6f435bdcf 100644 --- a/src/ceph_osd.cc +++ b/src/ceph_osd.cc @@ -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); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 55f11707189..976f55aa61c 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1231,6 +1231,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", @@ -1323,40 +1361,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() diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 4d8c31e3046..e0cf76c0f92 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1719,6 +1719,7 @@ public: // startup/shutdown int pre_init(); int init(); + void final_init(); void suicide(int exitcode); int shutdown();