From b2ba96e3409f0d9264a2e9ca24389c4c7b0561e9 Mon Sep 17 00:00:00 2001 From: Chris Darroch Date: Fri, 26 May 2006 16:26:52 +0000 Subject: [PATCH] Make the worker and event MPMs not touch the scoreboard when handling a fork() failure. The previous behaviour appears to have been inherited from the prefork MPM, where is it appropriate. The prefork MPM sets thread_limit to 1 and therefore each child process has a single worker_score structure in the scoreboard's array, i.e., ap_scoreboard_image->servers[slot][0]. In make_child(), it sets this structure's status to SERVER_STARTING, and then does a fork(); if the fork() fails, it resets the status to SERVER_DEAD. The worker and event MPMs, by constrast, obviously use multiple worker_score structures per child process. They may also be in use by worker threads from a previous generation at any particular moment. Therefore make_child() and the parent process in general doesn't normally update them; make_child() doesn't set them all to SERVER_STARTING before doing fork(), for example. So, make_child() shouldn't set them to SERVER_DEAD if fork() fails (and even if it should, it certainly shouldn't be just updating the first one). git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@409693 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ server/mpm/experimental/event/event.c | 8 +++++--- server/mpm/worker/worker.c | 9 +++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 297e4c5660..942c058b36 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.3.0 [Remove entries to the current 2.0 and 2.2 section below, when backported] + *) Worker and event MPMs: Remove improper scoreboard updates which were + performed in the event of a fork() failure. [Chris Darroch] + *) mod_cache: Make caching of reverse SSL proxies possible again. PR 39593. [Ruediger Pluem, Joe Orton] diff --git a/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c index 9eff7e3162..2a250f0d99 100644 --- a/server/mpm/experimental/event/event.c +++ b/server/mpm/experimental/event/event.c @@ -1608,10 +1608,12 @@ static int make_child(server_rec * s, int slot) ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, "fork: Unable to fork new process"); - /* fork didn't succeed. Fix the scoreboard or else - * it will say SERVER_STARTING forever and ever + /* fork didn't succeed. There's no need to touch the scoreboard; + * if we were trying to replace a failed child process, then + * server_main_loop() marked its workers SERVER_DEAD, and if + * we were trying to replace a child process that exited normally, + * its worker_thread()s left SERVER_DEAD or SERVER_GRACEFUL behind. */ - ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL); /* In case system resources are maxxed out, we don't want Apache running away with the CPU trying to fork over and diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index 4261515f3d..a4ea5c7adf 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1285,11 +1285,12 @@ static int make_child(server_rec *s, int slot) if ((pid = fork()) == -1) { ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, "fork: Unable to fork new process"); - - /* fork didn't succeed. Fix the scoreboard or else - * it will say SERVER_STARTING forever and ever + /* fork didn't succeed. There's no need to touch the scoreboard; + * if we were trying to replace a failed child process, then + * server_main_loop() marked its workers SERVER_DEAD, and if + * we were trying to replace a child process that exited normally, + * its worker_thread()s left SERVER_DEAD or SERVER_GRACEFUL behind. */ - ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL); /* In case system resources are maxxed out, we don't want Apache running away with the CPU trying to fork over and -- 2.40.0