diff options
author | Sage Weil <sage@inktank.com> | 2013-08-02 11:54:31 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-02 11:54:31 -0700 |
commit | ea1243a1122bd48c9f514b92f6c5d83391e814e5 (patch) | |
tree | 5d6fb6962d91859f6f726d848f8bc73d4798f80f | |
parent | 3fa1cd20b5d091ec997cf15251586d77f3cf079b (diff) | |
parent | 25948319c4d256c4aeb0137eb88947e54d14cc79 (diff) | |
download | ceph-ea1243a1122bd48c9f514b92f6c5d83391e814e5.tar.gz |
Merge remote-tracking branch 'gh/wip-rgw-leaks'
Reviewed-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_bucket.cc | 1 | ||||
-rw-r--r-- | src/rgw/rgw_main.cc | 56 | ||||
-rw-r--r-- | src/rgw/rgw_resolve.cc | 5 | ||||
-rw-r--r-- | src/rgw/rgw_resolve.h | 3 |
4 files changed, 44 insertions, 21 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index d32af5df601..e938b031bc7 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -1296,6 +1296,7 @@ RGWDataChangesLog::~RGWDataChangesLog() { down_flag.set(1); renew_thread->stop(); renew_thread->join(); + delete renew_thread; delete[] oids; } diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index 514e9e47171..ec62d670cea 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -65,9 +65,7 @@ using namespace std; -static sighandler_t sighandler_usr1; static sighandler_t sighandler_alrm; -static sighandler_t sighandler_term; class RGWProcess; @@ -262,14 +260,27 @@ void RGWProcess::run() m_tp.stop(); } -static void godown_handler(int signum) +static void handle_sigterm(int signum) { + dout(1) << __func__ << dendl; FCGX_ShutdownPending(); + + // close the fd, so that accept can't start again. pprocess->close_fd(); - signal(signum, sighandler_usr1); - uint64_t secs = g_ceph_context->_conf->rgw_exit_timeout_secs; - if (secs) - alarm(secs); + + // send a signal to make fcgi's accept(2) wake up. unfortunately the + // initial signal often isn't sufficient because we race with accept's + // check of the flag wet by ShutdownPending() above. + if (signum != SIGUSR1) { + kill(getpid(), SIGUSR1); + + // safety net in case we get stuck doing an orderly shutdown. + uint64_t secs = g_ceph_context->_conf->rgw_exit_timeout_secs; + if (secs) + alarm(secs); + dout(1) << __func__ << " set alarm for " << secs << dendl; + } + } static void godown_alarm(int signum) @@ -483,17 +494,8 @@ int main(int argc, const char **argv) curl_global_init(CURL_GLOBAL_ALL); - sighandler_usr1 = signal(SIGUSR1, godown_handler); - sighandler_alrm = signal(SIGALRM, godown_alarm); - - init_async_signal_handler(); - register_async_signal_handler(SIGHUP, sighup_handler); - FCGX_Init(); - sighandler_term = signal(SIGTERM, godown_alarm); - - int r = 0; RGWRados *store = RGWStoreManager::get_storage(g_ceph_context, true); if (!store) { @@ -563,7 +565,22 @@ int main(int argc, const char **argv) pprocess = new RGWProcess(g_ceph_context, store, olog, g_conf->rgw_thread_pool_size, &rest); + init_async_signal_handler(); + register_async_signal_handler(SIGHUP, sighup_handler); + register_async_signal_handler(SIGTERM, handle_sigterm); + register_async_signal_handler(SIGINT, handle_sigterm); + register_async_signal_handler(SIGUSR1, handle_sigterm); + + sighandler_alrm = signal(SIGALRM, godown_alarm); + pprocess->run(); + derr << "shutting down" << dendl; + + unregister_async_signal_handler(SIGHUP, sighup_handler); + unregister_async_signal_handler(SIGTERM, handle_sigterm); + unregister_async_signal_handler(SIGINT, handle_sigterm); + unregister_async_signal_handler(SIGUSR1, handle_sigterm); + shutdown_async_signal_handler(); delete pprocess; @@ -577,15 +594,14 @@ int main(int argc, const char **argv) rgw_perf_stop(g_ceph_context); - unregister_async_signal_handler(SIGHUP, sighup_handler); - RGWStoreManager::close_storage(store); rgw_tools_cleanup(); + rgw_shutdown_resolver(); curl_global_cleanup(); - g_ceph_context->put(); - shutdown_async_signal_handler(); + dout(1) << "final shutdown" << dendl; + g_ceph_context->put(); ceph::crypto::shutdown(); diff --git a/src/rgw/rgw_resolve.cc b/src/rgw/rgw_resolve.cc index adbff3f4318..9a8b14b2e01 100644 --- a/src/rgw/rgw_resolve.cc +++ b/src/rgw/rgw_resolve.cc @@ -170,3 +170,8 @@ void rgw_init_resolver() { rgw_resolver = new RGWResolver(); } + +void rgw_shutdown_resolver() +{ + delete rgw_resolver; +} diff --git a/src/rgw/rgw_resolve.h b/src/rgw/rgw_resolve.h index 164a31a0215..3b29ba580fe 100644 --- a/src/rgw/rgw_resolve.h +++ b/src/rgw/rgw_resolve.h @@ -8,14 +8,15 @@ class RGWDNSResolver; class RGWResolver { RGWDNSResolver *resolver; - ~RGWResolver(); public: + ~RGWResolver(); RGWResolver(); int resolve_cname(const string& hostname, string& cname, bool *found); }; extern void rgw_init_resolver(void); +extern void rgw_shutdown_resolver(void); extern RGWResolver *rgw_resolver; #endif |