diff options
author | Sage Weil <sage@inktank.com> | 2013-08-24 14:04:09 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-27 09:41:41 -0700 |
commit | 11f5853d8178ab60ab948d373c1a1f67324ce3bd (patch) | |
tree | 2f0163f8229638672ed465d2eb3835c48c0be849 | |
parent | 39adc0195e6016ce36828885515be1bffbc10ae1 (diff) | |
download | ceph-11f5853d8178ab60ab948d373c1a1f67324ce3bd.tar.gz |
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 <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
(cherry picked from commit c5b5ce120a8ce9116be52874dbbcc39adec48b5c)
-rw-r--r-- | src/ceph_osd.cc | 2 | ||||
-rw-r--r-- | src/osd/OSD.cc | 72 | ||||
-rw-r--r-- | src/osd/OSD.h | 1 |
3 files changed, 41 insertions, 34 deletions
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 1a77dae730a..f1ae117e91a 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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() diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 82a251d9a80..c6ee04fd710 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1681,6 +1681,7 @@ public: // startup/shutdown int pre_init(); int init(); + void final_init(); void suicide(int exitcode); int shutdown(); |