summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-08-02 11:54:31 -0700
committerSage Weil <sage@inktank.com>2013-08-02 11:54:31 -0700
commitea1243a1122bd48c9f514b92f6c5d83391e814e5 (patch)
tree5d6fb6962d91859f6f726d848f8bc73d4798f80f
parent3fa1cd20b5d091ec997cf15251586d77f3cf079b (diff)
parent25948319c4d256c4aeb0137eb88947e54d14cc79 (diff)
downloadceph-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.cc1
-rw-r--r--src/rgw/rgw_main.cc56
-rw-r--r--src/rgw/rgw_resolve.cc5
-rw-r--r--src/rgw/rgw_resolve.h3
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