Skip to content

Commit f5f93b6

Browse files
authored
Merge pull request #376 from jajik/lbstatus-calculation
Add checks for lbfactor < 0, minor refactor
2 parents b3bba8b + 24102b0 commit f5f93b6

2 files changed

Lines changed: 37 additions & 24 deletions

File tree

native/balancers/mod_lbmethod_cluster.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ static proxy_worker *internal_find_best_byrequests(request_rec *r, const proxy_b
3737
int i;
3838

3939
for (i = 0; i < balancer->workers->nelts; i++) {
40-
const nodeinfo_t *node;
41-
int id;
40+
const nodeinfo_t *node, *node1;
41+
int id, id1;
4242
proxy_worker *worker = *((proxy_worker **)(ptr + i * sizew));
4343

4444
if (!PROXY_WORKER_IS_USABLE(worker)) {
@@ -54,18 +54,22 @@ static proxy_worker *internal_find_best_byrequests(request_rec *r, const proxy_b
5454
}
5555
if (!mycandidate) {
5656
mycandidate = worker;
57-
} else {
58-
const nodeinfo_t *node1;
59-
int id1;
60-
node1 = table_get_node_route(node_table, mycandidate->s->route, &id1);
61-
if (node1) {
62-
int lbstatus, lbstatus1;
63-
lbstatus1 = ((mycandidate->s->elected - node1->mess.oldelected) * 1000) / mycandidate->s->lbfactor;
64-
lbstatus = ((worker->s->elected - node->mess.oldelected) * 1000) / worker->s->lbfactor;
65-
if (lbstatus1 > lbstatus) {
66-
mycandidate = worker;
67-
}
57+
continue;
58+
}
59+
60+
node1 = table_get_node_route(node_table, mycandidate->s->route, &id1);
61+
if (node1 && mycandidate->s->lbfactor > 0 && worker->s->lbfactor > 0) {
62+
int lbstatus, lbstatus1;
63+
lbstatus1 = ((mycandidate->s->elected - node1->mess.oldelected) * 1000) / mycandidate->s->lbfactor;
64+
lbstatus = ((worker->s->elected - node->mess.oldelected) * 1000) / worker->s->lbfactor;
65+
if (lbstatus1 > lbstatus) {
66+
mycandidate = worker;
6867
}
68+
} else {
69+
ap_log_error(
70+
APLOG_MARK, APLOG_DEBUG, 0, r->server,
71+
"internal_find_best_byrequests: skipping node %d mycandidate->s->lbfactor %d worker->s->lbfactor %d",
72+
id1, mycandidate->s->lbfactor, worker->s->lbfactor);
6973
}
7074
}
7175

native/mod_proxy_cluster/mod_proxy_cluster.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1672,26 +1672,35 @@ static proxy_worker *internal_process_worker(proxy_worker *worker, int checking_
16721672
*mycandidate = worker;
16731673
*mynodecontext = best1;
16741674
return worker; /* Done */
1675-
} else if (!(*mycandidate)) {
1675+
}
1676+
1677+
if (!(*mycandidate)) {
16761678
*mycandidate = worker;
16771679
*mynodecontext = best1;
16781680
*node1 = node;
1679-
} else {
1680-
int lbstatus, lbstatus1;
1681+
return worker;
1682+
}
16811683

1682-
/* Let's avoid repeat reads of mycandidate through our loop iterations */
1683-
if (!(*node1) && node_storage->read_node((*mycandidate)->s->index, node1) != APR_SUCCESS) {
1684-
*mycandidate = NULL;
1685-
return worker;
1686-
}
1684+
/* Let's avoid repeat reads of mycandidate through our loop iterations */
1685+
if (!(*node1) && node_storage->read_node((*mycandidate)->s->index, node1) != APR_SUCCESS) {
1686+
*mycandidate = NULL;
1687+
return worker;
1688+
}
16871689

1688-
lbstatus1 = (((*mycandidate)->s->elected - (*node1)->mess.oldelected) * 1000) / (*mycandidate)->s->lbfactor +
1689-
(*mycandidate)->s->lbstatus;
1690-
lbstatus = ((worker->s->elected - node->mess.oldelected) * 1000) / worker->s->lbfactor + worker->s->lbstatus;
1690+
if ((*mycandidate)->s->lbfactor > 0 && worker->s->lbfactor) {
1691+
int lbstatus1 =
1692+
(((*mycandidate)->s->elected - (*node1)->mess.oldelected) * 1000) / (*mycandidate)->s->lbfactor +
1693+
(*mycandidate)->s->lbstatus;
1694+
int lbstatus =
1695+
((worker->s->elected - node->mess.oldelected) * 1000) / worker->s->lbfactor + worker->s->lbstatus;
16911696
if (lbstatus1 > lbstatus) {
16921697
*mycandidate = worker;
16931698
*mynodecontext = best1;
16941699
}
1700+
} else {
1701+
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
1702+
"find_session_route: Could not recalculate lbstatus (candidate lbfactor: %d, worker lbfactor %d)",
1703+
(*mycandidate)->s->lbfactor, worker->s->lbfactor);
16951704
}
16961705

16971706
return worker;

0 commit comments

Comments
 (0)