From: Venky Shankar Date: Mon, 14 Oct 2019 10:51:03 +0000 (-0400) Subject: mgr: invoke plugin shutdown on SIG{TERM,INT} signals. X-Git-Tag: v15.1.0~978^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3d360b97ed7dead8e9a5f602cfaf61ab7b41e531;p=ceph.git mgr: invoke plugin shutdown on SIG{TERM,INT} signals. Mgr standby used to install signals handler but did pretty much nothing when signals were received. Move the signal handling part to Mgr core so as to invoke plugin shutdowns when ceph-mgr received SIGTERM or SIGINT. Fixes: http://tracker.ceph.com/issues/42299 Signed-off-by: Venky Shankar --- diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index 27f74f2b06e8..a10746a2cfb9 100644 --- a/src/mgr/Mgr.cc +++ b/src/mgr/Mgr.cc @@ -219,12 +219,35 @@ std::map Mgr::load_store() return loaded; } +void Mgr::handle_signal(int signum) +{ + ceph_assert(signum == SIGINT || signum == SIGTERM); + derr << "*** Got signal " << sig_str(signum) << " ***" << dendl; + shutdown(); + _exit(0); // exit with 0 result code, as if we had done an orderly shutdown +} + +// A reference for use by the signal handler +static Mgr *signal_mgr = nullptr; + +static void handle_mgr_signal(int signum) +{ + if (signal_mgr) { + signal_mgr->handle_signal(signum); + } +} + void Mgr::init() { std::unique_lock l(lock); ceph_assert(initializing); ceph_assert(!initialized); + // Enable signal handlers + signal_mgr = this; + register_async_signal_handler_oneshot(SIGINT, handle_mgr_signal); + register_async_signal_handler_oneshot(SIGTERM, handle_mgr_signal); + // Start communicating with daemons to learn statistics etc int r = server.init(monc->get_global_id(), client_messenger->get_myaddrs()); if (r < 0) { @@ -395,6 +418,7 @@ void Mgr::load_all_metadata() void Mgr::shutdown() { + dout(10) << "mgr shutdown init" << dendl; finisher.queue(new LambdaContext([&](int) { { std::lock_guard l(lock); diff --git a/src/mgr/Mgr.h b/src/mgr/Mgr.h index 85b1137fe0ff..d38a75cac931 100644 --- a/src/mgr/Mgr.h +++ b/src/mgr/Mgr.h @@ -94,6 +94,8 @@ public: void background_init(Context *completion); void shutdown(); + void handle_signal(int signum); + std::map get_services() const; }; diff --git a/src/mgr/MgrStandby.cc b/src/mgr/MgrStandby.cc index 7d193b6575b9..b021a1829715 100644 --- a/src/mgr/MgrStandby.cc +++ b/src/mgr/MgrStandby.cc @@ -259,14 +259,6 @@ void MgrStandby::tick() )); } -void MgrStandby::handle_signal(int signum) -{ - ceph_assert(signum == SIGINT || signum == SIGTERM); - derr << "*** Got signal " << sig_str(signum) << " ***" << dendl; - _exit(0); // exit with 0 result code, as if we had done an orderly shutdown - //shutdown(); -} - void MgrStandby::shutdown() { finisher.queue(new LambdaContext([&](int) { @@ -458,31 +450,13 @@ bool MgrStandby::ms_handle_refused(Connection *con) return false; } -// A reference for use by the signal handler -static MgrStandby *signal_mgr = nullptr; - -static void handle_mgr_signal(int signum) -{ - if (signal_mgr) { - signal_mgr->handle_signal(signum); - } -} - int MgrStandby::main(vector args) { - // Enable signal handlers - signal_mgr = this; - register_async_signal_handler_oneshot(SIGINT, handle_mgr_signal); - register_async_signal_handler_oneshot(SIGTERM, handle_mgr_signal); - client_messenger->wait(); // Disable signal handlers unregister_async_signal_handler(SIGHUP, sighup_handler); - unregister_async_signal_handler(SIGINT, handle_mgr_signal); - unregister_async_signal_handler(SIGTERM, handle_mgr_signal); shutdown_async_signal_handler(); - signal_mgr = nullptr; return 0; } diff --git a/src/mgr/MgrStandby.h b/src/mgr/MgrStandby.h index 98b9d0d22a78..d79fef2d5e57 100644 --- a/src/mgr/MgrStandby.h +++ b/src/mgr/MgrStandby.h @@ -80,7 +80,6 @@ public: void shutdown(); void respawn(); int main(vector args); - void handle_signal(int signum); void tick(); };