From: Greg Ames Date: Thu, 13 Apr 2006 17:53:04 +0000 (+0000) Subject: MaxClients isn't the only reason the scoreboard can fill up. another X-Git-Tag: 2.3.0~2456 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=801bb0266a2b01d672916e5cb6d04006f373f711;p=thirdparty%2Fapache%2Fhttpd.git MaxClients isn't the only reason the scoreboard can fill up. another reason should be fixed soon. also add a comment to explain an obscure line of code. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@393868 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c index 7f340300cc5..9bff9e30d9a 100644 --- a/server/mpm/experimental/event/event.c +++ b/server/mpm/experimental/event/event.c @@ -1705,6 +1705,10 @@ static void perform_idle_server_maintenance(void) if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate) + /* short cut if all active processes have been examined and + * enough empty scoreboard slots have been found + */ + break; ps = &ap_scoreboard_image->parent[i]; for (j = 0; j < ap_threads_per_child; j++) { @@ -1795,15 +1799,23 @@ static void perform_idle_server_maintenance(void) } else if (idle_thread_count < min_spare_threads) { /* terminate the free list */ - if (free_length == 0) { + if (free_length == 0) { /* scoreboard is full, can't fork */ /* only report this condition once */ static int reported = 0; if (!reported) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, - ap_server_conf, - "server reached MaxClients setting, consider" - " raising the MaxClients setting"); + if (active_thread_count >= + ap_daemons_limit * ap_threads_per_child) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "scoreboard is full, not at MaxClients"); + } reported = 1; } idle_spawn_rate = 1; diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index faf9747e2e8..8d64860d95d 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1397,6 +1397,9 @@ static void perform_idle_server_maintenance(void) int all_dead_threads = 1; if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate) + /* short cut if all active processes have been examined and + * enough empty scoreboard slots have been found + */ break; ps = &ap_scoreboard_image->parent[i]; for (j = 0; j < ap_threads_per_child; j++) { @@ -1488,15 +1491,23 @@ static void perform_idle_server_maintenance(void) } else if (idle_thread_count < min_spare_threads) { /* terminate the free list */ - if (free_length == 0) { + if (free_length == 0) { /* scoreboard is full, can't fork */ /* only report this condition once */ static int reported = 0; if (!reported) { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, - ap_server_conf, - "server reached MaxClients setting, consider" - " raising the MaxClients setting"); + if (active_thread_count >= + ap_daemons_limit * ap_threads_per_child) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "scoreboard is full, not at MaxClients"); + } reported = 1; } idle_spawn_rate = 1;