]> granicus.if.org Git - apache/commitdiff
Port the MaxClients changes from the worker MPM to the threaded
authorRyan Bloom <rbb@apache.org>
Tue, 16 Oct 2001 04:02:28 +0000 (04:02 +0000)
committerRyan Bloom <rbb@apache.org>
Tue, 16 Oct 2001 04:02:28 +0000 (04:02 +0000)
MPM.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@91483 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
docs/conf/httpd-std.conf
server/mpm/threaded/threaded.c

diff --git a/CHANGES b/CHANGES
index 23210ab1e730709e04ab6262d3cb41f77573a807..57272811e530e4dd868033e714c9ccf15adb7f5b 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.26-dev
 
+  *) Port the MaxClients changes from the worker MPM to the threaded
+     MPM.  [Ryan Bloom]
+
   *) Fix mod_proxy so that it handles chunked transfer-encoding and works
      with the new input filtering system.  [Justin Erenkrantz]
 
index 30cedd66c0b37610a3f2d8e70693b27f9d592b4b..5e7d47a41822dd1dcea6d6feeb38cf397d4f1402 100644 (file)
@@ -126,8 +126,8 @@ MaxRequestsPerChild  0
 # MaxRequestsPerChild: maximum number of requests a server process serves
 <IfModule threaded.c>
 StartServers         3
-MaxClients           8
-MinSpareThreads      5
+MaxClients         150
+MinSpareThreads     25
 MaxSpareThreads     75 
 ThreadsPerChild     25
 MaxRequestsPerChild  0
index 5a14e1ce7889434288ac6d24e5f2dc23e215e950..8b4f5834215942b6ed9c70136a2e6c761c45aef9 100644 (file)
@@ -1359,6 +1359,44 @@ static void threaded_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t
 {
     static int restart_num = 0;
     int no_detach, debug;
+    ap_directive_t *pdir;
+    ap_directive_t *max_clients = NULL;
+
+    /* make sure that "ThreadsPerChild" gets set before "MaxClients" */
+    for (pdir = ap_conftree; pdir != NULL; pdir = pdir->next) {
+        if (strncasecmp(pdir->directive, "ThreadsPerChild", 15) == 0) {
+            if (!max_clients) {
+                break; /* we're in the clear, got ThreadsPerChild first */
+            }
+            else {
+                /* now to swap the data */
+                ap_directive_t temp;
+                temp.directive = pdir->directive;
+                temp.args = pdir->args;
+                /* Make sure you don't change 'next', or you may get loops! */
+                /* XXX: first_child, parent, and data can never be set
+                 * for these directives, right? -aaron */
+                temp.filename = pdir->filename;
+                temp.line_num = pdir->line_num;
+                pdir->directive = max_clients->directive;
+                pdir->args = max_clients->args;
+                pdir->filename = max_clients->filename;
+                pdir->line_num = max_clients->line_num;
+                max_clients->directive = temp.directive;
+                max_clients->args = temp.args;
+                max_clients->filename = temp.filename;
+                max_clients->line_num = temp.line_num;
+                break;
+            }
+        }
+        else if (!max_clients
+                && strncasecmp(pdir->directive, "MaxClients", 10) == 0) {
+            max_clients = pdir;
+        }
+    }
 
     debug = ap_exists_config_define("DEBUG");
 
@@ -1452,27 +1490,58 @@ static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy,
 static const char *set_server_limit (cmd_parms *cmd, void *dummy,
                                     const char *arg) 
 {
+    int max_clients;
     const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
     if (err != NULL) {
         return err;
     }
-
-    ap_daemons_limit = atoi(arg);
+    /* It is ok to use ap_threads_per_child here because we are
+     * sure that it gets set before MaxClients in the pre_config stage. */
+    max_clients = atoi(arg);
+    if (max_clients < ap_threads_per_child) {
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    "WARNING: MaxClients (%d) must be at least as large",
+                    max_clients);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " large as ThreadsPerChild (%d). Automatically",
+                    ap_threads_per_child);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " increasing MaxClients to %d.",
+                    ap_threads_per_child);
+       max_clients = ap_threads_per_child;
+    }
+    ap_daemons_limit = max_clients / ap_threads_per_child;
+    if ((max_clients > 0) && (max_clients % ap_threads_per_child)) {
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    "WARNING: MaxClients (%d) is not an integer multiple",
+                    max_clients);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " of ThreadsPerChild (%d), lowering MaxClients to %d",
+                    ap_threads_per_child,
+                    ap_daemons_limit * ap_threads_per_child);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " for a maximum of %d child processes,",
+                    ap_daemons_limit);
+    }
     if (ap_daemons_limit > HARD_SERVER_LIMIT) {
-       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
-                    "WARNING: MaxClients of %d exceeds compile time limit "
-                    "of %d servers,", ap_daemons_limit, HARD_SERVER_LIMIT);
-       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
-                    " lowering MaxClients to %d.  To increase, please "
-                    "see the", HARD_SERVER_LIMIT);
-       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, 
-                    " HARD_SERVER_LIMIT define in %s.",
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    "WARNING: MaxClients of %d would require %d servers,",
+                    max_clients, ap_daemons_limit);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " and would exceed the compile time limit of %d.",
+                    HARD_SERVER_LIMIT);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " Automatically lowering MaxClients to %d.  To increase,",
+                    HARD_SERVER_LIMIT);
+       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+                    " please see the HARD_SERVER_LIMIT define in %s.",
                     AP_MPM_HARD_LIMITS_FILE);
        ap_daemons_limit = HARD_SERVER_LIMIT;
-    } 
+    }
     else if (ap_daemons_limit < 1) {
-       ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "WARNING: Require MaxClients > 0, setting to 1");
-       ap_daemons_limit = 1;
+        ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "WARNING: Require MaxClients > 0, setting to 1");
+        ap_daemons_limit = 1;
     }
     return NULL;
 }