From 3d360b97ed7dead8e9a5f602cfaf61ab7b41e531 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Mon, 14 Oct 2019 06:51:03 -0400 Subject: [PATCH] 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 --- src/mgr/Mgr.cc | 24 ++++++++++++++++++++++++ src/mgr/Mgr.h | 2 ++ src/mgr/MgrStandby.cc | 26 -------------------------- src/mgr/MgrStandby.h | 1 - 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/mgr/Mgr.cc b/src/mgr/Mgr.cc index 27f74f2b06e..a10746a2cfb 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 85b1137fe0f..d38a75cac93 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 7d193b6575b..b021a182971 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 98b9d0d22a7..d79fef2d5e5 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(); }; -- 2.47.3