[Pound Mailing List] [PATCH 2/3] Remove Grace period option, wait for all worker threads to finish
Lubomir Rintel <lubo.rintel-Vz9dX3IBr95Wk0Htik3J/[email protected]>
| Newsgroups | gmane.comp.web.pound.general |
|---|---|
| Message-ID | <[email protected]> |
From: Miroslav Spousta <miroslav.spousta-Vz9dX3IBr95Wk0Htik3J/[email protected]> When worker is required to shut down (by SIGHUP/SIGINT), it waits for all busy threads to finish. Number of running threads is monitored every 10 seconds. During the shutdown, control socket is temporary renamed (pid is appended to the socket name), so that it is still accessible and correct socket is removed on exit. --- config.c | 7 +------ pound.8 | 10 ---------- pound.c | 35 ++++++++++++++++++++++++++++++----- pound.h | 1 - 4 files changed, 31 insertions(+), 22 deletions(-) mode change 100644 => 100755 config.c mode change 100644 => 100755 pound.8 mode change 100644 => 100755 pound.c diff --git a/config.c b/config.c old mode 100644 new mode 100755 index ae45991..c0f5437 --- a/config.c +++ b/config.c @@ -79,7 +79,7 @@ static regex_t Err414, Err500, Err501, Err503, MaxRequest, HeadRemove, RewriteL static regex_t Service, ServiceName, URL, HeadRequire, HeadDeny, BackEnd, Emergency, Priority, HAport, HAportAddr; static regex_t Redirect, RedirectN, TimeOut, Session, Type, TTL, ID, DynScale; static regex_t ClientCert, AddHeader, DisableSSLv2, SSLAllowClientRenegotiation, SSLHonorCipherOrder, Ciphers; -static regex_t CAlist, VerifyList, CRLlist, NoHTTPS11, Grace, Include, ConnTO, IgnoreCase, HTTPS, HTTPSCert; +static regex_t CAlist, VerifyList, CRLlist, NoHTTPS11, Include, ConnTO, IgnoreCase, HTTPS, HTTPSCert; static regex_t Disabled, Threads, CNName, Anonymise; static regmatch_t matches[5]; @@ -1273,8 +1273,6 @@ parse_file(void) def_facility = facilitynames[i].c_val; break; } - } else if(!regexec(&Grace, lin, 4, matches, 0)) { - grace = atoi(lin + matches[1].rm_so); } else if(!regexec(&LogLevel, lin, 4, matches, 0)) { log_level = atoi(lin + matches[1].rm_so); } else if(!regexec(&Client, lin, 4, matches, 0)) { @@ -1373,7 +1371,6 @@ config_parse(const int argc, char **const argv) || regcomp(&Threads, "^[ \t]*Threads[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&LogFacility, "^[ \t]*LogFacility[ \t]+([a-z0-9-]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&LogLevel, "^[ \t]*LogLevel[ \t]+([0-5])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) - || regcomp(&Grace, "^[ \t]*Grace[ \t]+([0-9]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&Alive, "^[ \t]*Alive[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&SSLEngine, "^[ \t]*SSLEngine[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) || regcomp(&Control, "^[ \t]*Control[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED) @@ -1509,7 +1506,6 @@ config_parse(const int argc, char **const argv) numthreads = 128; alive_to = 30; daemonize = 1; - grace = 30; services = NULL; listeners = NULL; @@ -1535,7 +1531,6 @@ config_parse(const int argc, char **const argv) regfree(&Threads); regfree(&LogFacility); regfree(&LogLevel); - regfree(&Grace); regfree(&Alive); regfree(&SSLEngine); regfree(&Control); diff --git a/pound.8 b/pound.8 old mode 100644 new mode 100755 index bda2fd8..08c6a22 --- a/pound.8 +++ b/pound.8 @@ -296,16 +296,6 @@ wait for a connection to the back-end (in seconds). Default: the .B TimeOut value. This value can be overridden for specific back-ends. .TP -\fBGrace\fR value -How long should -.B Pound -continue to answer existing connections after a receiving and INT or HUP -signal (default: 30 seconds). The configured listeners are closed -immediately. You can bypass this behaviour by stopping -.B Pound -with a TERM or QUIT signal, in which case the program exits without any -delay. -.TP \fBSSLEngine\fR "name" Use an OpenSSL hardware acceleration card called \fIname\fR. Available only if OpenSSL-engine is installed on your system. diff --git a/pound.c b/pound.c old mode 100644 new mode 100755 index d008468..a047b96 --- a/pound.c +++ b/pound.c @@ -27,6 +27,9 @@ #include "pound.h" +/* while in shutdown, check number of running threads every 10 seconds */ +#define RUNNING_CHECK_PERIOD 10 + /* common variables */ char *user, /* user to run as */ *group, /* group to run as */ @@ -39,7 +42,6 @@ int alive_to, /* check interval for resurrection */ daemonize, /* run as daemon */ log_facility, /* log facility to use */ print_log, /* print log messages to stdout/stderr */ - grace, /* grace period before shutdown */ control_sock; /* control socket */ SERVICE *services; /* global services (if any) */ @@ -112,6 +114,7 @@ static thr_arg *first = NULL, *last = NULL; static pthread_cond_t arg_cond; static pthread_mutex_t arg_mut; int numthreads; +static int waiting = 0; static void init_thr_arg(void) @@ -156,8 +159,10 @@ get_thr_arg(void) thr_arg *res; (void)pthread_mutex_lock(&arg_mut); + waiting++; while(first == NULL) (void)pthread_cond_wait(&arg_cond, &arg_mut); + waiting--; if((res = first) != NULL) if((first = first->next) == NULL) last = NULL; @@ -486,13 +491,33 @@ main(const int argc, char **argv) /* and start working */ for(;;) { if(shut_down) { - logmsg(LOG_NOTICE, "shutting down..."); + int finished; + + logmsg(LOG_NOTICE, "shutting down (%d)...", getpid()); for(lstn = listeners; lstn; lstn = lstn->next) close(lstn->sock); - if(grace > 0) { - sleep(grace); - logmsg(LOG_NOTICE, "grace period expired - exiting..."); + /* rename control file (append pid) */ + if(ctrl_name != NULL) { + char *ctrl_tmp = malloc(strlen(ctrl_name)+11); + sprintf(ctrl_tmp, "%s.%d", ctrl_name, getpid()); + rename(ctrl_name, ctrl_tmp); + free(ctrl_name); + ctrl_name = ctrl_tmp; + } + /* wait for all threads to be finished */ + finished = 0; + while(!finished) { + int running; + (void)pthread_mutex_lock(&arg_mut); + running = numthreads-waiting; + finished = !first && !running; + (void)pthread_mutex_unlock(&arg_mut); + if(!finished) { + logmsg(LOG_INFO, "%d thread(s) still running...", running); + sleep(RUNNING_CHECK_PERIOD); + } } + logmsg(LOG_NOTICE, "no threads running - exiting..."); if(ctrl_name != NULL) (void)unlink(ctrl_name); exit(0); diff --git a/pound.h b/pound.h index 4c18763..fe37080 100644 --- a/pound.h +++ b/pound.h @@ -272,7 +272,6 @@ extern int numthreads, /* number of worker threads */ daemonize, /* run as daemon */ log_facility, /* log facility to use */ print_log, /* print log messages to stdout/stderr */ - grace, /* grace period before shutdown */ control_sock; /* control socket */ extern regex_t HEADER, /* Allowed header */ -- 1.8.3.1 -- To unsubscribe send an email with subject unsubscribe to [email protected] Please contact [email protected] for questions.