[MINOR] backend: reorganize the LB algorithm selection

We can now factor out some common tests between all map-based
algorithms. This removes some redundancy and makes the code more
logical.
This commit is contained in:
Willy Tarreau 2009-10-03 12:36:05 +02:00
parent f3e49f9521
commit da76f4f711

View File

@ -502,94 +502,98 @@ int assign_server(struct session *s)
goto out; goto out;
} }
switch (s->be->lbprm.algo & BE_LB_ALGO) { /* First check whether we need to fetch some data or simply call
case BE_LB_ALGO_RR: * the LB lookup function. Only the hashing functions will need
* some input data in fact, and will support multiple algorithms.
*/
switch (s->be->lbprm.algo & BE_LB_LKUP) {
case BE_LB_LKUP_RRTREE:
s->srv = fwrr_get_next_server(s->be, s->prev_srv); s->srv = fwrr_get_next_server(s->be, s->prev_srv);
if (!s->srv) {
err = SRV_STATUS_FULL;
goto out;
}
break; break;
case BE_LB_ALGO_LC:
case BE_LB_LKUP_LCTREE:
s->srv = fwlc_get_next_server(s->be, s->prev_srv); s->srv = fwlc_get_next_server(s->be, s->prev_srv);
if (!s->srv) {
err = SRV_STATUS_FULL;
goto out;
}
break; break;
case BE_LB_ALGO_SH:
if (s->cli_addr.ss_family == AF_INET) case BE_LB_LKUP_MAP:
len = 4; if ((s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_HI) {
else if (s->cli_addr.ss_family == AF_INET6) /* unknown balancing algorithm */
len = 16;
else {
/* unknown IP family */
err = SRV_STATUS_INTERNAL; err = SRV_STATUS_INTERNAL;
goto out; goto out;
} }
switch (s->be->lbprm.algo & BE_LB_PARM) {
case BE_LB_HASH_SRC:
if (s->cli_addr.ss_family == AF_INET)
len = 4;
else if (s->cli_addr.ss_family == AF_INET6)
len = 16;
else {
/* unknown IP family */
err = SRV_STATUS_INTERNAL;
goto out;
}
s->srv = get_server_sh(s->be, s->srv = get_server_sh(s->be,
(void *)&((struct sockaddr_in *)&s->cli_addr)->sin_addr, (void *)&((struct sockaddr_in *)&s->cli_addr)->sin_addr,
len); len);
break; break;
case BE_LB_ALGO_UH:
/* URI hashing */ case BE_LB_HASH_URI:
s->srv = get_server_uh(s->be, /* URI hashing */
s->txn.req.sol + s->txn.req.sl.rq.u, s->srv = get_server_uh(s->be,
s->txn.req.sl.rq.u_l);
break;
case BE_LB_ALGO_PH:
/* URL Parameter hashing */
if (s->txn.meth == HTTP_METH_POST &&
memchr(s->txn.req.sol + s->txn.req.sl.rq.u, '&',
s->txn.req.sl.rq.u_l ) == NULL)
s->srv = get_server_ph_post(s);
else
s->srv = get_server_ph(s->be,
s->txn.req.sol + s->txn.req.sl.rq.u, s->txn.req.sol + s->txn.req.sl.rq.u,
s->txn.req.sl.rq.u_l); s->txn.req.sl.rq.u_l);
break;
if (!s->srv) { case BE_LB_HASH_PRM:
/* parameter not found, fall back to round robin on the map */ /* URL Parameter hashing */
s->srv = map_get_server_rr(s->be, s->prev_srv); if (s->txn.meth == HTTP_METH_POST &&
if (!s->srv) { memchr(s->txn.req.sol + s->txn.req.sl.rq.u, '&',
err = SRV_STATUS_FULL; s->txn.req.sl.rq.u_l ) == NULL)
goto out; s->srv = get_server_ph_post(s);
} else
} s->srv = get_server_ph(s->be,
break; s->txn.req.sol + s->txn.req.sl.rq.u,
case BE_LB_ALGO_HH: s->txn.req.sl.rq.u_l);
/* Header Parameter hashing */ break;
s->srv = get_server_hh(s);
if (!s->srv) { case BE_LB_HASH_HDR:
/* parameter not found, fall back to round robin on the map */ /* Header Parameter hashing */
s->srv = map_get_server_rr(s->be, s->prev_srv); s->srv = get_server_hh(s);
if (!s->srv) { break;
err = SRV_STATUS_FULL;
goto out;
}
}
break;
case BE_LB_ALGO_RCH:
/* RDP Cookie hashing */
s->srv = get_server_rch(s);
if (!s->srv) { case BE_LB_HASH_RDP:
/* parameter not found, fall back to round robin on the map */ /* RDP Cookie hashing */
s->srv = map_get_server_rr(s->be, s->prev_srv); s->srv = get_server_rch(s);
if (!s->srv) { break;
err = SRV_STATUS_FULL;
goto out; default:
} /* unknown balancing algorithm */
err = SRV_STATUS_INTERNAL;
goto out;
} }
/* If the hashing parameter was not found, let's fall
* back to round robin on the map.
*/
if (!s->srv)
s->srv = map_get_server_rr(s->be, s->prev_srv);
/* end of map-based LB */
break; break;
default: default:
/* unknown balancing algorithm */ /* unknown balancing algorithm */
err = SRV_STATUS_INTERNAL; err = SRV_STATUS_INTERNAL;
goto out; goto out;
} }
if (s->srv != s->prev_srv) {
if (!s->srv) {
err = SRV_STATUS_FULL;
goto out;
}
else if (s->srv != s->prev_srv) {
s->be->cum_lbconn++; s->be->cum_lbconn++;
s->srv->cum_lbconn++; s->srv->cum_lbconn++;
} }