summaryrefslogtreecommitdiffstats
path: root/modules/proxy/balancers/mod_lbmethod_bytraffic.c
diff options
context:
space:
mode:
authorJim Riggs <jhriggs@apache.org>2018-04-11 14:11:05 +0200
committerJim Riggs <jhriggs@apache.org>2018-04-11 14:11:05 +0200
commit55b450576537c4dded19c24ada5fea17477b2bed (patch)
tree815eb0ef119a626fdece68d1225bb1099fb206ad /modules/proxy/balancers/mod_lbmethod_bytraffic.c
parentOn the trunk: (diff)
downloadapache2-55b450576537c4dded19c24ada5fea17477b2bed.tar.xz
apache2-55b450576537c4dded19c24ada5fea17477b2bed.zip
mod_proxy_balancer: Add hot spare member type and corresponding flag (R). Hot spare members are
used as drop-in replacements for unusable workers in the same load balancer set. This differs from hot standbys which are only used when all workers in a set are unusable. PR 61140. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1828890 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/proxy/balancers/mod_lbmethod_bytraffic.c')
-rw-r--r--modules/proxy/balancers/mod_lbmethod_bytraffic.c90
1 files changed, 16 insertions, 74 deletions
diff --git a/modules/proxy/balancers/mod_lbmethod_bytraffic.c b/modules/proxy/balancers/mod_lbmethod_bytraffic.c
index 6cf2478de5..7c42f925b5 100644
--- a/modules/proxy/balancers/mod_lbmethod_bytraffic.c
+++ b/modules/proxy/balancers/mod_lbmethod_bytraffic.c
@@ -22,8 +22,20 @@
module AP_MODULE_DECLARE_DATA lbmethod_bytraffic_module;
-static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
- proxy_worker *worker, server_rec *s) = NULL;
+static int is_best_bytraffic(proxy_worker *current, proxy_worker *prev_best, void *baton)
+{
+ apr_off_t *min_traffic = (apr_off_t *)baton;
+ apr_off_t traffic = (current->s->transferred / current->s->lbfactor)
+ + (current->s->read / current->s->lbfactor);
+
+ if (!prev_best || (traffic < *min_traffic)) {
+ *min_traffic = traffic;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
/*
* The idea behind the find_best_bytraffic scheduler is the following:
@@ -45,80 +57,10 @@ static int (*ap_proxy_retry_worker_fn)(const char *proxy_function,
static proxy_worker *find_best_bytraffic(proxy_balancer *balancer,
request_rec *r)
{
- int i;
- apr_off_t mytraffic = 0;
- apr_off_t curmin = 0;
- proxy_worker **worker;
- proxy_worker *mycandidate = NULL;
- int cur_lbset = 0;
- int max_lbset = 0;
- int checking_standby;
- int checked_standby;
+ apr_off_t min_traffic = 0;
- if (!ap_proxy_retry_worker_fn) {
- ap_proxy_retry_worker_fn =
- APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
- if (!ap_proxy_retry_worker_fn) {
- /* can only happen if mod_proxy isn't loaded */
- return NULL;
+ return ap_proxy_balancer_get_best_worker(balancer, r, is_best_bytraffic, &min_traffic);
}
- }
-
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, APLOGNO(01209)
- "proxy: Entering bytraffic for BALANCER (%s)",
- balancer->s->name);
-
- /* First try to see if we have available candidate */
- do {
- checking_standby = checked_standby = 0;
- while (!mycandidate && !checked_standby) {
- worker = (proxy_worker **)balancer->workers->elts;
- for (i = 0; i < balancer->workers->nelts; i++, worker++) {
- if (!checking_standby) { /* first time through */
- if ((*worker)->s->lbset > max_lbset)
- max_lbset = (*worker)->s->lbset;
- }
- if (
- ((*worker)->s->lbset != cur_lbset) ||
- (checking_standby ? !PROXY_WORKER_IS_STANDBY(*worker) : PROXY_WORKER_IS_STANDBY(*worker)) ||
- (PROXY_WORKER_IS_DRAINING(*worker))
- ) {
- continue;
- }
-
- /* If the worker is in error state run
- * retry on that worker. It will be marked as
- * operational if the retry timeout is elapsed.
- * The worker might still be unusable, but we try
- * anyway.
- */
- if (!PROXY_WORKER_IS_USABLE(*worker))
- ap_proxy_retry_worker_fn("BALANCER", *worker, r->server);
- /* Take into calculation only the workers that are
- * not in error state or not disabled.
- */
- if (PROXY_WORKER_IS_USABLE(*worker)) {
- mytraffic = ((*worker)->s->transferred/(*worker)->s->lbfactor) +
- ((*worker)->s->read/(*worker)->s->lbfactor);
- if (!mycandidate || mytraffic < curmin) {
- mycandidate = *worker;
- curmin = mytraffic;
- }
- }
- }
- checked_standby = checking_standby++;
- }
- cur_lbset++;
- } while (cur_lbset <= max_lbset && !mycandidate);
-
- if (mycandidate) {
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, APLOGNO(01210)
- "proxy: bytraffic selected worker \"%s\" : busy %" APR_SIZE_T_FMT,
- mycandidate->s->name, mycandidate->s->busy);
- }
-
- return mycandidate;
-}
/* assumed to be mutex protected by caller */
static apr_status_t reset(proxy_balancer *balancer, server_rec *s)