Unverified Commit 5b8dda84 authored by Ge Jun's avatar Ge Jun Committed by GitHub

Merge pull request #239 from DatongLi/master

add SIGTERM handle for brpc controller
parents cf085378 accaeb74
...@@ -77,6 +77,8 @@ BAIDU_REGISTER_ERRNO(brpc::EITP, "Bad Itp response"); ...@@ -77,6 +77,8 @@ BAIDU_REGISTER_ERRNO(brpc::EITP, "Bad Itp response");
namespace brpc { namespace brpc {
DEFINE_bool(graceful_quit_on_sigterm, false, "Register SIGTERM handle func to quit graceful");
const IdlNames idl_single_req_single_res = { "req", "res" }; const IdlNames idl_single_req_single_res = { "req", "res" };
const IdlNames idl_single_req_multi_res = { "req", "" }; const IdlNames idl_single_req_multi_res = { "req", "" };
const IdlNames idl_multi_req_single_res = { "", "res" }; const IdlNames idl_multi_req_single_res = { "", "res" };
...@@ -1374,27 +1376,48 @@ typedef sighandler_t SignalHandler; ...@@ -1374,27 +1376,48 @@ typedef sighandler_t SignalHandler;
#endif #endif
static volatile bool s_signal_quit = false; static volatile bool s_signal_quit = false;
static SignalHandler s_prev_handler = NULL; static SignalHandler s_prev_sigint_handler = NULL;
static SignalHandler s_prev_sigterm_handler = NULL;
static void quit_handler(int signo) { static void quit_handler(int signo) {
s_signal_quit = true; s_signal_quit = true;
if (s_prev_handler) { if (SIGINT == signo && s_prev_sigint_handler) {
s_prev_handler(signo); s_prev_sigint_handler(signo);
}
if (SIGTERM == signo && s_prev_sigterm_handler) {
s_prev_sigterm_handler(signo);
} }
} }
static pthread_once_t register_quit_signal_once = PTHREAD_ONCE_INIT; static pthread_once_t register_quit_signal_once = PTHREAD_ONCE_INIT;
static void RegisterQuitSignalOrDie() { static void RegisterQuitSignalOrDie() {
// Not thread-safe. // Not thread-safe.
const SignalHandler prev = signal(SIGINT, quit_handler); SignalHandler prev = signal(SIGINT, quit_handler);
if (prev != SIG_DFL && if (prev != SIG_DFL &&
prev != SIG_IGN) { // shell may install SIGINT of background jobs with SIG_IGN prev != SIG_IGN) { // shell may install SIGINT of background jobs with SIG_IGN
if (prev == SIG_ERR) { if (prev == SIG_ERR) {
LOG(ERROR) << "Fail to register SIGINT, abort"; LOG(ERROR) << "Fail to register SIGINT, abort";
abort(); abort();
} else { } else {
s_prev_handler = prev; s_prev_sigint_handler = prev;
LOG(WARNING) << "SIGINT was installed with " << prev; LOG(WARNING) << "SIGINT was installed with " << prev;
} }
} }
if (FLAGS_graceful_quit_on_sigterm) {
prev = signal(SIGTERM, quit_handler);
if (prev != SIG_DFL &&
prev != SIG_IGN) { // shell may install SIGTERM of background jobs with SIG_IGN
if (prev == SIG_ERR) {
LOG(ERROR) << "Fail to register SIGTERM, abort";
abort();
} else {
s_prev_sigterm_handler = prev;
LOG(WARNING) << "SIGTERM was installed with " << prev;
}
}
}
} }
bool IsAskedToQuit() { bool IsAskedToQuit() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment