From 2558c41a85699d4254a48ff66b07ae2beb0b2c8c Mon Sep 17 00:00:00 2001
From: Jim Jagielski
Date: Tue, 19 Sep 2017 10:17:40 +0000
Subject: [PATCH] Merge r1805188, r1805190, r1805206, r1808723 from trunk:
loadfactor now decimal
Umm. This is C :)
Fix remaining lint from ms capability for hchecks.
format typo
Reviewed by: jim, humbedooh, ylavic
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1808855 13f79535-47bb-0310-9956-ffa450edef68
---
CHANGES | 3 +++
STATUS | 9 ---------
docs/manual/mod/mod_proxy.xml | 6 +++---
modules/proxy/mod_proxy.c | 5 +++--
modules/proxy/mod_proxy_balancer.c | 22 ++++++++++++----------
modules/proxy/proxy_util.c | 2 +-
6 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/CHANGES b/CHANGES
index e7a2d65763..c6b3bcaedb 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,9 @@ Changes with Apache 2.4.28
length in a password file.
[Luca Toscano, Hanno Böck ]
+ *) mod_proxy: loadfactor parameter can now be a decimal number (eg: 1.25).
+ [Jim Jagielski]
+
*) mod_proxy_wstunnel: Allow upgrade to any protocol dynamically.
PR 61142.
diff --git a/STATUS b/STATUS
index 5766e70a84..6aa0a9f5a6 100644
--- a/STATUS
+++ b/STATUS
@@ -115,15 +115,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- *) mod_proxy: Loadfactor can now be a decimal number (eg: 1.25)
- trunk patch: http://svn.apache.org/r1805188
- http://svn.apache.org/r1805190
- http://svn.apache.org/r1805206 (partial)
- http://svn.apache.org/r1808723
- 2.4.x patch: http://home.apache.org/~jim/patches/httpd-2.4-loadfactor-v2.patch
- +1: jim, humbedooh, ylavic
- ylavic: conflicts on the docs, addressable while backporting I guess.
-
*) mod_speling: Don't embed Referer data in link in error page.
trunk patch: http://svn.apache.org/r1808780
2.4.x: trunk patch applies
diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml
index 73b2042b1d..4bd5146986 100644
--- a/docs/manual/mod/mod_proxy.xml
+++ b/docs/manual/mod/mod_proxy.xml
@@ -785,8 +785,8 @@ expressions
directive and can take any of the key value pair parameters available to
ProxyPass directives.
One additional parameter is available only to BalancerMember directives:
- loadfactor. This is the member load factor - a number between 1
- (default) and 100, which defines the weighted load to be applied to the
+ loadfactor. This is the member load factor - a decimal number between 1.0
+ (default) and 100.0, which defines the weighted load to be applied to the
member in question.
The balancerurl is only needed when not within a
<Proxy balancer://...>
@@ -1332,7 +1332,7 @@ ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofail
ProxyPass "/" "balancer://hotcluster/"
<Proxy "balancer://hotcluster">
BalancerMember "ajp://1.2.3.4:8009" loadfactor=1
- BalancerMember "ajp://1.2.3.5:8009" loadfactor=2
+ BalancerMember "ajp://1.2.3.5:8009" loadfactor=2.25
# The server below is on hot standby
BalancerMember "ajp://1.2.3.6:8009" status=+H
ProxySet lbmethod=bytraffic
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
index 3f916f66df..314fc0d782 100644
--- a/modules/proxy/mod_proxy.c
+++ b/modules/proxy/mod_proxy.c
@@ -103,7 +103,8 @@ static const char *set_worker_param(apr_pool_t *p,
/* Normalized load factor. Used with BalancerMember,
* it is a number between 1 and 100.
*/
- ival = atoi(val);
+ double fval = atof(val);
+ ival = fval * 100.0;
if (ival < 1 || ival > 100)
return "LoadFactor must be a number between 1..100";
worker->s->lbfactor = ival;
@@ -2685,7 +2686,7 @@ static int proxy_status_hook(request_rec *r, int flags)
ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, *worker), NULL);
ap_rvputs(r, "
", (*worker)->s->route, NULL);
ap_rvputs(r, " | ", (*worker)->s->redirect, NULL);
- ap_rprintf(r, " | %d | ", (*worker)->s->lbfactor);
+ ap_rprintf(r, "%.2f | ", (float)((*worker)->s->lbfactor)/100.0);
ap_rprintf(r, "%d | ", (*worker)->s->lbset);
ap_rprintf(r, "%" APR_SIZE_T_FMT " | ",
(*worker)->s->elected);
diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c
index 61ff5e4721..9c58590a87 100644
--- a/modules/proxy/mod_proxy_balancer.c
+++ b/modules/proxy/mod_proxy_balancer.c
@@ -700,10 +700,10 @@ static void recalc_factors(proxy_balancer *balancer)
/* Recalculate lbfactors */
workers = (proxy_worker **)balancer->workers->elts;
/* Special case if there is only one worker its
- * load factor will always be 1
+ * load factor will always be 100
*/
if (balancer->workers->nelts == 1) {
- (*workers)->s->lbstatus = (*workers)->s->lbfactor = 1;
+ (*workers)->s->lbstatus = (*workers)->s->lbfactor = 100;
return;
}
for (i = 0; i < balancer->workers->nelts; i++) {
@@ -1093,8 +1093,10 @@ static int balancer_handler(request_rec *r)
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01192) "settings worker params");
if ((val = apr_table_get(params, "w_lf"))) {
- int ival = atoi(val);
- if (ival >= 1 && ival <= 100) {
+ int ival;
+ double fval = atof(val);
+ ival = fval * 100.0;
+ if (ival >= 100 && ival <= 10000) {
wsel->s->lbfactor = ival;
if (bsel)
recalc_factors(bsel);
@@ -1362,8 +1364,8 @@ static int balancer_handler(request_rec *r)
"\n", NULL);
ap_rvputs(r, " ", worker->s->hostname,
"\n", NULL);
- ap_rprintf(r, " %d\n",
- worker->s->lbfactor);
+ ap_rprintf(r, " %.2f\n",
+ (float)(worker->s->lbfactor)/100.0);
ap_rprintf(r,
" %d\n",
worker->s->port);
@@ -1416,8 +1418,8 @@ static int balancer_handler(request_rec *r)
" %d\n",
worker->s->lbstatus);
ap_rprintf(r,
- " %d\n",
- worker->s->lbfactor);
+ " %.2f\n",
+ (float)(worker->s->lbfactor)/100.0);
ap_rprintf(r,
" %" APR_OFF_T_FMT "\n",
worker->s->transferred);
@@ -1603,7 +1605,7 @@ static int balancer_handler(request_rec *r)
NULL);
ap_rvputs(r, " | ",
ap_escape_html(r->pool, worker->s->redirect), NULL);
- ap_rprintf(r, " | %d | ", worker->s->lbfactor);
+ ap_rprintf(r, "%.2f | ", (float)(worker->s->lbfactor)/100.0);
ap_rprintf(r, "%d | ", worker->s->lbset);
ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, worker), NULL);
ap_rputs(" | ", r);
@@ -1638,7 +1640,7 @@ static int balancer_handler(request_rec *r)
ap_rputs("