summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-24 14:04:09 -0700
committerSage Weil <sage@inktank.com>2013-08-27 09:41:41 -0700
commit11f5853d8178ab60ab948d373c1a1f67324ce3bd (patch)
tree2f0163f8229638672ed465d2eb3835c48c0be849
parent39adc0195e6016ce36828885515be1bffbc10ae1 (diff)
downloadceph-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.cc2
-rw-r--r--src/osd/OSD.cc72
-rw-r--r--src/osd/OSD.h1
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();