From: Jim Jagielski Date: Mon, 27 Oct 2014 12:46:45 +0000 (+0000) Subject: Merge r1629577 from trunk: X-Git-Tag: 2.4.11~222 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bf4ce5c6eb92478a3ae0318541b73ec8aed18b0;p=thirdparty%2Fapache%2Fhttpd.git Merge r1629577 from trunk: event: Fix worker-listener deadlock in graceful restart caused by get_worker() allocating new worker after ap_queue_info_term(), but not setting the have_idle_worker variable. PR 56960. Submitted By: Zin UDA Committed By: jkaluza Submitted by: jkaluza Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1634526 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index d5410705f96..6b1d9b5d4bc 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.4.11 + *) event: Fix worker-listener deadlock in graceful restart. + PR 56960. + *) Concat strings at compile time when possible. PR 53741. *) mod_substitute: Restrict configuration in .htaccess to diff --git a/STATUS b/STATUS index e06f637ad54..e4ba2e3c763 100644 --- a/STATUS +++ b/STATUS @@ -102,13 +102,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * event: Fix worker-listener deadlock in graceful restart caused by - get_worker() allocating new worker after ap_queue_info_term(), - but not setting the have_idle_worker variable. PR 56960. - trunk patch: http://svn.apache.org/r1629577 - 2.4.x patch: trunk works - +1: jkaluza, ylavic, jim - * mod_cache_socache: Add cache status to server-status. The status_hook simply calls the status function of socache, very much like mod_ssl does for the ssl diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index ee92237e5af..82e7d11c4e3 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -1271,13 +1271,13 @@ static void get_worker(int *have_idle_worker_p, int blocking, int *all_busy) else rc = ap_queue_info_try_get_idler(worker_queue_info); - if (rc == APR_SUCCESS) { + if (rc == APR_SUCCESS || APR_STATUS_IS_EOF(rc)) { *have_idle_worker_p = 1; } else if (!blocking && rc == APR_EAGAIN) { *all_busy = 1; } - else if (!APR_STATUS_IS_EOF(rc)) { + else { ap_log_error(APLOG_MARK, APLOG_ERR, rc, ap_server_conf, APLOGNO(00472) "ap_queue_info_wait_for_idler failed. " "Attempting to shutdown process gracefully");