]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Add WorkerBalancerGrowth. To allow creation of workers
authorJean-Frederic Clere <jfclere@apache.org>
Wed, 30 Mar 2022 14:42:14 +0000 (14:42 +0000)
committerJean-Frederic Clere <jfclere@apache.org>
Wed, 30 Mar 2022 14:42:14 +0000 (14:42 +0000)
to dynamically added balancers.

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

CHANGES
modules/proxy/mod_proxy.c
modules/proxy/mod_proxy.h

diff --git a/CHANGES b/CHANGES
index dfc95693ce4ab845ddad3d90dd040c37d44ea787..0072b2e1b489b7f9daf31ae58a1476ace410bb7e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
+  *) mod_proxy: Add WorkerBalancerGrowth to allow adding workers to
+     balancer created dynamically or via "empty" <Proxy balancer://../>
+     [Jean-Frederic Clere]
+
   *) ab: Add an optional ramp delay when starting concurrent connections so
      as to not trigger denial of service protection in the network. Report
      levels of concurrency achieved in cases where the test completes before
index 27f31185787c150a07ae532f70c5df7fbbae59d6..47f00e7742e864edf5362baf49555eab997bed10 100644 (file)
@@ -1633,6 +1633,8 @@ static void * create_proxy_config(apr_pool_t *p, server_rec *s)
     ps->ppinherit_set = 0;
     ps->bgrowth = 5;
     ps->bgrowth_set = 0;
+    ps->wbgrowth = 0;
+    ps->wbgrowth_set = 0;
     ps->req_set = 0;
     ps->recv_buffer_size = 0; /* this default was left unset for some reason */
     ps->recv_buffer_size_set = 0;
@@ -1789,6 +1791,8 @@ static void * merge_proxy_config(apr_pool_t *p, void *basev, void *overridesv)
     ps->req_set = overrides->req_set || base->req_set;
     ps->bgrowth = (overrides->bgrowth_set == 0) ? base->bgrowth : overrides->bgrowth;
     ps->bgrowth_set = overrides->bgrowth_set || base->bgrowth_set;
+    ps->wbgrowth = (overrides->wbgrowth_set == 0) ? base->wbgrowth : overrides->wbgrowth;
+    ps->wbgrowth_set = overrides->wbgrowth_set || base->wbgrowth_set;
     ps->max_balancers = overrides->max_balancers || base->max_balancers;
     ps->bal_persist = overrides->bal_persist;
     ps->recv_buffer_size = (overrides->recv_buffer_size_set == 0) ? base->recv_buffer_size : overrides->recv_buffer_size;
@@ -2664,6 +2668,21 @@ static const char *set_bgrowth(cmd_parms *parms, void *dummy, const char *arg)
     return NULL;
 }
 
+static const char *set_wbgrowth(cmd_parms *parms, void *dummy, const char *arg)
+{
+    proxy_server_conf *psf =
+    ap_get_module_config(parms->server->module_config, &proxy_module);
+
+    int growth = atoi(arg);
+    if (growth < 0 || growth > 1000) {
+        return "WorkerBalancerGrowth must be between 0 and 1000";
+    }
+    psf->wbgrowth = growth;
+    psf->wbgrowth_set = 1;
+
+    return NULL;
+}
+
 static const char *set_persist(cmd_parms *parms, void *dummy, int flag)
 {
     proxy_server_conf *psf =
@@ -3047,6 +3066,35 @@ static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg)
                 return apr_pstrcat(cmd->temp_pool, thiscmd->name, " ", err, " ",
                                    word, "=", val, "; ", conf->p, NULL);
         }
+    } else {
+        /* we have an empty <Proxy/> */
+        if (!ap_strchr_c(conf->p, ':'))
+            return apr_pstrcat(cmd->pool, thiscmd->name,
+                               "> arguments are not supported for non url.",
+                               NULL);
+        if (ap_proxy_valid_balancer_name((char *)conf->p, 9)) {
+            balancer = ap_proxy_get_balancer(cmd->pool, sconf, conf->p, 0);
+            if (!balancer) {
+                err = ap_proxy_define_balancer(cmd->pool, &balancer,
+                                               sconf, conf->p, "/", 0);
+                if (err)
+                    return apr_pstrcat(cmd->temp_pool, thiscmd->name,
+                                       " ", err, NULL);
+            }
+            if (!balancer->section_config) {
+                balancer->section_config = new_dir_conf;
+            }
+            /* Allow to add members dynamically */
+            if (sconf->wbgrowth_set) {
+                balancer->growth = sconf->wbgrowth;
+                balancer->growth_set = 1;
+            } else {
+                return apr_pstrcat(cmd->temp_pool, thiscmd->name, "/> requires WorkerBalancerGrowth > 0.", NULL);
+            }
+        } else {
+            return apr_pstrcat(cmd->pool, thiscmd->name, " " ,conf->p,
+                               "> only balancer://balancername is supported.", NULL);
+        }
     }
 
     cmd->path = old_path;
@@ -3109,6 +3157,8 @@ static const command_rec proxy_cmds[] =
      "A balancer name and scheme with list of params"),
     AP_INIT_TAKE1("BalancerGrowth", set_bgrowth, NULL, RSRC_CONF,
      "Number of additional Balancers that can be added post-config"),
+    AP_INIT_TAKE1("WorkerBalancerGrowth", set_wbgrowth, NULL, RSRC_CONF,
+     "Number of additional Workers per Balancer that can be added post-config"),
     AP_INIT_FLAG("BalancerPersist", set_persist, NULL, RSRC_CONF,
      "on if the balancer should persist changes on reboot/restart made via the Balancer Manager"),
     AP_INIT_FLAG("BalancerInherit", set_inherit, NULL, RSRC_CONF,
index 2eac740dac5962aa9e762b5cedf02b91fe804652..8281edd14d398f9b67c79beead60669cb490e270 100644 (file)
@@ -163,6 +163,7 @@ typedef struct {
     int req;                /* true if proxy requests are enabled */
     int max_balancers;      /* maximum number of allowed balancers */
     int bgrowth;            /* number of post-config balancers can added */
+    int wbgrowth;            /* number of post-config work per balancer that can added */
     enum {
       via_off,
       via_on,
@@ -198,6 +199,7 @@ typedef struct {
     unsigned int proxy_status_set:1;
     unsigned int source_address_set:1;
     unsigned int bgrowth_set:1;
+    unsigned int wbgrowth_set:1;
     unsigned int bal_persist:1;
     unsigned int inherit:1;
     unsigned int inherit_set:1;