Skip to content

Commit

Permalink
Use new [ap_]atomics for proxy_worker_shared->busy/lbstatus.
Browse files Browse the repository at this point in the history
  • Loading branch information
ylavic committed Nov 30, 2023
1 parent 51df13e commit 48e1c63
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 206 deletions.
48 changes: 28 additions & 20 deletions modules/proxy/balancers/mod_lbmethod_bybusyness.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "scoreboard.h"
#include "ap_mpm.h"
#include "apr_version.h"
#include "ap_atomics.h"
#include "ap_hooks.h"

module AP_MODULE_DECLARE_DATA lbmethod_bybusyness_module;
Expand All @@ -30,23 +31,30 @@ static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
static int is_best_bybusyness(proxy_worker *current, proxy_worker *prev_best, void *baton)
{
int *total_factor = (int *)baton;
apr_size_t current_busy = ap_proxy_get_busy_count(current);
apr_size_t prev_best_busy = 0;

current->s->lbstatus += current->s->lbfactor;
*total_factor += current->s->lbfactor;
if (prev_best)
prev_best_busy = ap_proxy_get_busy_count(prev_best);


return (
!prev_best
|| (current_busy < prev_best_busy)
|| (
(current_busy == prev_best_busy)
&& (current->s->lbstatus > prev_best->s->lbstatus)
)
);
int lbfactor = current->s->lbfactor, lbstatus;

*total_factor += lbfactor;
lbstatus = ap_atomic_int_add_sat(&current->s->lbstatus, lbfactor);
if (prev_best) {
apr_size_t current_busy = ap_atomic_size_get(&current->s->busy);
apr_size_t prev_busy = ap_atomic_size_get(&prev_best->s->busy);
if (current_busy > prev_busy) {
return 0;
}
if (current_busy == prev_busy) {
/* lbstatus is the value before atomic add */
if (lbstatus < APR_INT32_MAX - lbfactor) {
lbstatus += lbfactor;
}
else {
lbstatus = APR_INT32_MAX;
}
if (lbstatus <= ap_atomic_int_get(&prev_best->s->lbstatus)) {
return 0;
}
}
}
return 1;
}

static proxy_worker *find_best_bybusyness(proxy_balancer *balancer,
Expand All @@ -58,7 +66,7 @@ static proxy_worker *find_best_bybusyness(proxy_balancer *balancer,
&total_factor);

if (worker) {
worker->s->lbstatus -= total_factor;
ap_atomic_int_sub_sat(&worker->s->lbstatus, total_factor);
}

return worker;
Expand All @@ -71,8 +79,8 @@ static apr_status_t reset(proxy_balancer *balancer, server_rec *s)
proxy_worker **worker;
worker = (proxy_worker **)balancer->workers->elts;
for (i = 0; i < balancer->workers->nelts; i++, worker++) {
(*worker)->s->lbstatus = 0;
ap_proxy_set_busy_count(*worker, 0);
ap_atomic_int_set(&(*worker)->s->lbstatus, 0);
ap_atomic_size_set(&(*worker)->s->busy, 0);
}
return APR_SUCCESS;
}
Expand Down
31 changes: 23 additions & 8 deletions modules/proxy/balancers/mod_lbmethod_byrequests.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "scoreboard.h"
#include "ap_mpm.h"
#include "apr_version.h"
#include "ap_atomics.h"
#include "ap_hooks.h"

module AP_MODULE_DECLARE_DATA lbmethod_byrequests_module;
Expand All @@ -28,11 +29,23 @@ static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
static int is_best_byrequests(proxy_worker *current, proxy_worker *prev_best, void *baton)
{
int *total_factor = (int *)baton;

current->s->lbstatus += current->s->lbfactor;
*total_factor += current->s->lbfactor;

return (!prev_best || (current->s->lbstatus > prev_best->s->lbstatus));
int lbfactor = current->s->lbfactor, lbstatus;

*total_factor += lbfactor;
lbstatus = ap_atomic_int_add_sat(&current->s->lbstatus, lbfactor);
if (prev_best) {
/* lbstatus is the value before atomic add */
if (lbstatus < APR_INT32_MAX - lbfactor) {
lbstatus += lbfactor;
}
else {
lbstatus = APR_INT32_MAX;
}
if (lbstatus <= ap_atomic_int_get(&prev_best->s->lbstatus)) {
return 0;
}
}
return 1;
}

/*
Expand Down Expand Up @@ -84,10 +97,12 @@ static proxy_worker *find_best_byrequests(proxy_balancer *balancer,
request_rec *r)
{
int total_factor = 0;
proxy_worker *worker = ap_proxy_balancer_get_best_worker_fn(balancer, r, is_best_byrequests, &total_factor);
proxy_worker *worker = ap_proxy_balancer_get_best_worker_fn(balancer, r,
is_best_byrequests,
&total_factor);

if (worker) {
worker->s->lbstatus -= total_factor;
ap_atomic_int_sub_sat(&worker->s->lbstatus, total_factor);
}

return worker;
Expand All @@ -100,7 +115,7 @@ static apr_status_t reset(proxy_balancer *balancer, server_rec *s)
proxy_worker **worker;
worker = (proxy_worker **)balancer->workers->elts;
for (i = 0; i < balancer->workers->nelts; i++, worker++) {
(*worker)->s->lbstatus = 0;
ap_atomic_int_set(&(*worker)->s->lbstatus, 0);
}
return APR_SUCCESS;
}
Expand Down
19 changes: 9 additions & 10 deletions modules/proxy/balancers/mod_lbmethod_bytraffic.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "scoreboard.h"
#include "ap_mpm.h"
#include "apr_version.h"
#include "ap_atomics.h"
#include "ap_hooks.h"

module AP_MODULE_DECLARE_DATA lbmethod_bytraffic_module;
Expand All @@ -28,16 +29,14 @@ static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
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);
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;
if (prev_best && traffic >= *min_traffic) {
return 0;
}

return FALSE;
*min_traffic = traffic;
return 1;
}

/*
Expand Down Expand Up @@ -73,8 +72,8 @@ static apr_status_t reset(proxy_balancer *balancer, server_rec *s)
proxy_worker **worker;
worker = (proxy_worker **)balancer->workers->elts;
for (i = 0; i < balancer->workers->nelts; i++, worker++) {
(*worker)->s->lbstatus = 0;
(*worker)->s->busy = 0;
ap_atomic_int_set(&(*worker)->s->lbstatus, 0);
ap_atomic_size_set(&(*worker)->s->busy, 0);
(*worker)->s->transferred = 0;
(*worker)->s->read = 0;
}
Expand Down
35 changes: 21 additions & 14 deletions modules/proxy/mod_proxy_balancer.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "scoreboard.h"
#include "ap_mpm.h"
#include "apr_version.h"
#include "ap_atomics.h"
#include "ap_hooks.h"
#include "apr_date.h"
#include "apr_escape.h"
Expand Down Expand Up @@ -485,6 +486,13 @@ static void force_recovery(proxy_balancer *balancer, server_rec *s)
}
}

static apr_status_t proxy_worker_decrement_busy(void *arg)
{
proxy_worker *worker = arg;
ap_atomic_size_sub_sat(&worker->s->busy, 1);
return APR_SUCCESS;
}

static int proxy_balancer_pre_request(proxy_worker **worker,
proxy_balancer **balancer,
request_rec *r,
Expand Down Expand Up @@ -545,12 +553,12 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
* not in error state or not disabled.
*/
if (PROXY_WORKER_IS_USABLE(*workers)) {
(*workers)->s->lbstatus += (*workers)->s->lbfactor;
ap_atomic_int_add_sat(&(*workers)->s->lbstatus, (*workers)->s->lbfactor);
total_factor += (*workers)->s->lbfactor;
}
workers++;
}
runtime->s->lbstatus -= total_factor;
ap_atomic_int_sub_sat(&runtime->s->lbstatus, total_factor);
}
runtime->s->elected++;

Expand Down Expand Up @@ -623,8 +631,8 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
*worker = runtime;
}

ap_proxy_increment_busy_count(*worker);
apr_pool_cleanup_register(r->pool, *worker, ap_proxy_decrement_busy_count,
ap_atomic_size_add_sat(&(*worker)->s->busy, 1);
apr_pool_cleanup_register(r->pool, *worker, proxy_worker_decrement_busy,
apr_pool_cleanup_null);

/* Add balancer/worker info to env. */
Expand Down Expand Up @@ -726,16 +734,15 @@ 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 100
*/
if (balancer->workers->nelts == 1) {
(*workers)->s->lbstatus = (*workers)->s->lbfactor = 100;
return;
/* Special case if there is only one worker its
* load factor will always be 100
*/
workers[0]->s->lbfactor = 100;
}
for (i = 0; i < balancer->workers->nelts; i++) {
/* Update the status entries */
workers[i]->s->lbstatus = workers[i]->s->lbfactor;
ap_atomic_int_set(&workers[i]->s->lbstatus, workers[i]->s->lbfactor);
}
}

Expand Down Expand Up @@ -1542,7 +1549,7 @@ static void balancer_display_page(request_rec *r, proxy_server_conf *conf,
worker->s->retries);
ap_rprintf(r,
" <httpd:lbstatus>%d</httpd:lbstatus>\n",
worker->s->lbstatus);
ap_atomic_int_get(&worker->s->lbstatus));
ap_rprintf(r,
" <httpd:loadfactor>%.2f</httpd:loadfactor>\n",
(float)(worker->s->lbfactor)/100.0);
Expand All @@ -1563,7 +1570,7 @@ static void balancer_display_page(request_rec *r, proxy_server_conf *conf,
"</httpd:redirect>\n", NULL);
ap_rprintf(r,
" <httpd:busy>%" APR_SIZE_T_FMT "</httpd:busy>\n",
ap_proxy_get_busy_count(worker));
ap_atomic_size_get(&worker->s->busy));
ap_rprintf(r, " <httpd:lbset>%d</httpd:lbset>\n",
worker->s->lbset);
/* End proxy_worker_stat */
Expand Down Expand Up @@ -1736,8 +1743,8 @@ static void balancer_display_page(request_rec *r, proxy_server_conf *conf,
ap_rvputs(r, ap_proxy_parse_wstatus(r->pool, worker), NULL);
ap_rputs("</td>", r);
ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td>", worker->s->elected);
ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td>", ap_proxy_get_busy_count(worker));
ap_rprintf(r, "<td>%d</td><td>", worker->s->lbstatus);
ap_rprintf(r, "<td>%" APR_SIZE_T_FMT "</td>", ap_atomic_size_get(&worker->s->busy));
ap_rprintf(r, "<td>%d</td><td>", ap_atomic_int_get(&worker->s->lbstatus));
ap_rputs(apr_strfsize(worker->s->transferred, fbuf), r);
ap_rputs("</td><td>", r);
ap_rputs(apr_strfsize(worker->s->read, fbuf), r);
Expand Down
Loading

0 comments on commit 48e1c63

Please sign in to comment.