From: Eric Covener Date: Sat, 31 Jan 2009 20:54:55 +0000 (+0000) Subject: Merge r732421, r732451 from trunk: X-Git-Tag: 2.2.12~243 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bde79a7ab44985258bc20a0a753bb0fca5dee51a;p=thirdparty%2Fapache%2Fhttpd.git Merge r732421, r732451 from trunk: Release the accept mutex after receiving the shutdown signal in single-process mode. (That isn't a critical step, but neatness counts.) Submitted by: rpleum prefork: Fix child process hang during graceful restart/stop in configurations with multiple listening sockets. PR: 42829 Submitted by: Joe Orton, with some tweaking and testing from me Reviewed by: trawick, rpluem, jorton, pgollucci git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@739608 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 058b267bd0f..b9accdbd457 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.12 + *) prefork: Fix child process hang during graceful restart/stop in + configurations with multiple listening sockets. PR 42829. [Joe Orton, + Jeff Trawick] + *) mod_ssl: Add SSLRenegBufferSize directive to allow changing the size of the buffer used for the request-body where necessary during a per-dir renegotiation. PR 39243. [Joe Orton] diff --git a/STATUS b/STATUS index 530da8b9014..fe59594446b 100644 --- a/STATUS +++ b/STATUS @@ -86,17 +86,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * prefork: release mutex when exiting in single-process mode, - add timeout to pollset-poll to avoid hanging during graceful - stop/restart with multiple listening sockets - PR 42829 - Trunk version of patche: - http://svn.apache.org/viewvc?rev=732421&view=rev - http://svn.apache.org/viewvc?rev=732451&view=rev - Backport version for 2.2.x of patch: - Trunk version of patch works - +1: trawick, rpluem, jorton, pgollucci - * mod_proxy: Set the error time if we set a worker in error mode. Trunk version of patch: http://svn.apache.org/viewvc?rev=734703&view=rev diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index ce56dc5c773..28b60573f11 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -577,19 +577,27 @@ static void child_main(int child_num_arg) apr_int32_t numdesc; const apr_pollfd_t *pdesc; - /* timeout == -1 == wait forever */ - status = apr_pollset_poll(pollset, -1, &numdesc, &pdesc); + /* check for termination first so we don't sleep for a while in + * poll if already signalled + */ + if (one_process && shutdown_pending) { + SAFE_ACCEPT(accept_mutex_off()); + return; + } + else if (die_now) { + /* In graceful stop/restart; drop the mutex + * and terminate the child. */ + SAFE_ACCEPT(accept_mutex_off()); + clean_child_exit(0); + } + /* timeout == 10 seconds to avoid a hang at graceful restart/stop + * caused by the closing of sockets by the signal handler + */ + status = apr_pollset_poll(pollset, apr_time_from_sec(10), + &numdesc, &pdesc); if (status != APR_SUCCESS) { - if (APR_STATUS_IS_EINTR(status)) { - if (one_process && shutdown_pending) { - return; - } - else if (die_now) { - /* In graceful stop/restart; drop the mutex - * and terminate the child. */ - SAFE_ACCEPT(accept_mutex_off()); - clean_child_exit(0); - } + if (APR_STATUS_IS_TIMEUP(status) || + APR_STATUS_IS_EINTR(status)) { continue; } /* Single Unix documents select as returning errnos