You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2011/10/10 01:10:13 UTC
svn commit: r1180742 - in /httpd/httpd/trunk: CHANGES
server/mpm/event/event.c server/mpm/prefork/prefork.c
server/mpm/worker/worker.c
Author: sf
Date: Sun Oct 9 23:10:12 2011
New Revision: 1180742
URL: http://svn.apache.org/viewvc?rev=1180742&view=rev
Log:
If a child is created just before graceful restart and then exits because
of a missing lock file, don't shutdown the whole server.
PR: 39311
Submitted by: Shawn Michael <smichael rightnow com>
Modified:
httpd/httpd/trunk/CHANGES
httpd/httpd/trunk/server/mpm/event/event.c
httpd/httpd/trunk/server/mpm/prefork/prefork.c
httpd/httpd/trunk/server/mpm/worker/worker.c
Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1180742&r1=1180741&r2=1180742&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Sun Oct 9 23:10:12 2011
@@ -12,6 +12,11 @@ Changes with Apache 2.3.15
PR 51714. [Stefan Fritsch, Jim Jagielski, Ruediger Pluem, Eric Covener,
<lowprio20 gmail.com>]
+ *) mpm_prefork, mpm_worker, mpm_event: If a child is created just before
+ graceful restart and then exits because of a missing lock file, don't
+ shutdown the whole server. PR 39311. [Shawn Michael
+ <smichael rightnow com>]
+
*) mpm_event: Check the return value from ap_run_create_connection.
PR: 41194. [Davi Arnaut]
Modified: httpd/httpd/trunk/server/mpm/event/event.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1180742&r1=1180741&r2=1180742&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/event/event.c (original)
+++ httpd/httpd/trunk/server/mpm/event/event.c Sun Oct 9 23:10:12 2011
@@ -2421,10 +2421,27 @@ static void server_main_loop(int remaini
if (pid.pid != -1) {
processed_status = ap_process_child_status(&pid, exitwhy, status);
+ child_slot = ap_find_child_by_pid(&pid);
if (processed_status == APEXIT_CHILDFATAL) {
- shutdown_pending = 1;
- child_fatal = 1;
- return;
+ /* fix race condition found in PR 39311
+ * A child created at the same time as a graceful happens
+ * can find the lock missing and create a fatal error.
+ * It is not fatal for the last generation to be in this state.
+ */
+ if (child_slot < 0
+ || ap_get_scoreboard_process(child_slot)->generation
+ == retained->my_generation) {
+ shutdown_pending = 1;
+ child_fatal = 1;
+ return;
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf,
+ "Ignoring fatal error in child of previous "
+ "generation (pid %ld).",
+ (long)pid.pid);
+ retained->sick_child_detected = 1;
+ }
}
else if (processed_status == APEXIT_CHILDSICK) {
/* tell perform_idle_server_maintenance to check into this
@@ -2433,7 +2450,6 @@ static void server_main_loop(int remaini
retained->sick_child_detected = 1;
}
/* non-fatal death... note that it's gone in the scoreboard. */
- child_slot = ap_find_child_by_pid(&pid);
if (child_slot >= 0) {
for (i = 0; i < threads_per_child; i++)
ap_update_child_status_from_indexes(child_slot, i,
Modified: httpd/httpd/trunk/server/mpm/prefork/prefork.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/prefork/prefork.c?rev=1180742&r1=1180741&r2=1180742&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/prefork/prefork.c (original)
+++ httpd/httpd/trunk/server/mpm/prefork/prefork.c Sun Oct 9 23:10:12 2011
@@ -1004,13 +1004,28 @@ static int prefork_run(apr_pool_t *_pcon
*/
if (pid.pid != -1) {
processed_status = ap_process_child_status(&pid, exitwhy, status);
+ child_slot = ap_find_child_by_pid(&pid);
if (processed_status == APEXIT_CHILDFATAL) {
- mpm_state = AP_MPMQ_STOPPING;
- return DONE;
+ /* fix race condition found in PR 39311
+ * A child created at the same time as a graceful happens
+ * can find the lock missing and create a fatal error.
+ * It is not fatal for the last generation to be in this state.
+ */
+ if (child_slot < 0
+ || ap_get_scoreboard_process(child_slot)->generation
+ == retained->my_generation) {
+ mpm_state = AP_MPMQ_STOPPING;
+ return DONE;
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf,
+ "Ignoring fatal error in child of previous "
+ "generation (pid %ld).",
+ (long)pid.pid);
+ }
}
/* non-fatal death... note that it's gone in the scoreboard. */
- child_slot = ap_find_child_by_pid(&pid);
if (child_slot >= 0) {
(void) ap_update_child_status_from_indexes(child_slot, 0, SERVER_DEAD,
(request_rec *) NULL);
Modified: httpd/httpd/trunk/server/mpm/worker/worker.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/worker/worker.c?rev=1180742&r1=1180741&r2=1180742&view=diff
==============================================================================
--- httpd/httpd/trunk/server/mpm/worker/worker.c (original)
+++ httpd/httpd/trunk/server/mpm/worker/worker.c Sun Oct 9 23:10:12 2011
@@ -1647,10 +1647,27 @@ static void server_main_loop(int remaini
if (pid.pid != -1) {
processed_status = ap_process_child_status(&pid, exitwhy, status);
+ child_slot = ap_find_child_by_pid(&pid);
if (processed_status == APEXIT_CHILDFATAL) {
- shutdown_pending = 1;
- child_fatal = 1;
- return;
+ /* fix race condition found in PR 39311
+ * A child created at the same time as a graceful happens
+ * can find the lock missing and create a fatal error.
+ * It is not fatal for the last generation to be in this state.
+ */
+ if (child_slot < 0
+ || ap_get_scoreboard_process(child_slot)->generation
+ == retained->my_generation) {
+ shutdown_pending = 1;
+ child_fatal = 1;
+ return;
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf,
+ "Ignoring fatal error in child of previous "
+ "generation (pid %ld).",
+ (long)pid.pid);
+ retained->sick_child_detected = 1;
+ }
}
else if (processed_status == APEXIT_CHILDSICK) {
/* tell perform_idle_server_maintenance to check into this
@@ -1659,7 +1676,6 @@ static void server_main_loop(int remaini
retained->sick_child_detected = 1;
}
/* non-fatal death... note that it's gone in the scoreboard. */
- child_slot = ap_find_child_by_pid(&pid);
if (child_slot >= 0) {
for (i = 0; i < threads_per_child; i++)
ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD,