]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r732421, r732451 from trunk:
authorEric Covener <covener@apache.org>
Sat, 31 Jan 2009 20:54:55 +0000 (20:54 +0000)
committerEric Covener <covener@apache.org>
Sat, 31 Jan 2009 20:54:55 +0000 (20:54 +0000)
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

CHANGES
STATUS
server/mpm/prefork/prefork.c

diff --git a/CHANGES b/CHANGES
index 058b267bd0fa9521aeb7fab1f09544ed2890c2eb..b9accdbd457340fd164c25569e44a1ad1a4b9536 100644 (file)
--- 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 530da8b901476c70ed7309c11202ca8ba9a65abb..fe59594446b7db2b0e54302774b2fee7b27ebf65 100644 (file)
--- 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
index ce56dc5c773d6aeb6b56523554069bcbdc9b49fa..28b60573f1129ba76fb48ded190f0044f7a76eb4 100644 (file)
@@ -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