From: Andrew Rodland Date: Tue, 25 Oct 2016 16:49:45 +0000 (-0400) Subject: MINOR: server: compute a "cumulative weight" to allow chash balancing to hit its... X-Git-Tag: v1.7-dev5~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=13d5ebb91361c001286dd3ca91481d98d75ed031;p=thirdparty%2Fhaproxy.git MINOR: server: compute a "cumulative weight" to allow chash balancing to hit its target For active servers, this is the sum of the eweights of all active servers before this one in the backend, and [srv->cumulative_weight .. srv_cumulative_weight + srv_eweight) is a space occupied by this server in the range [0 .. lbprm.tot_wact), and likewise for backup servers with tot_wbck. This allows choosing a server or a range of servers proportional to their weight, by simple integer comparison. Signed-off-by: Andrew Rodland --- diff --git a/include/types/server.h b/include/types/server.h index ce138206b1..5d89212823 100644 --- a/include/types/server.h +++ b/include/types/server.h @@ -203,6 +203,7 @@ struct server { unsigned wscore; /* weight score, used during srv map computation */ unsigned prev_eweight; /* eweight before last change */ unsigned rweight; /* remainer of weight in the current LB tree */ + unsigned cumulative_weight; /* weight of servers prior to this one in the same group, for chash balancing */ unsigned npos, lpos; /* next and last positions in the LB tree */ struct eb32_node lb_node; /* node used for tree-based load balancing */ struct eb_root *lb_tree; /* we want to know in what tree the server is */ diff --git a/src/backend.c b/src/backend.c index faf872c0b1..573f054dc7 100644 --- a/src/backend.c +++ b/src/backend.c @@ -115,9 +115,11 @@ void recount_servers(struct proxy *px) !(px->options & PR_O_USE_ALL_BK)) px->lbprm.fbck = srv; px->srv_bck++; + srv->cumulative_weight = px->lbprm.tot_wbck; px->lbprm.tot_wbck += srv->eweight; } else { px->srv_act++; + srv->cumulative_weight = px->lbprm.tot_wact; px->lbprm.tot_wact += srv->eweight; } }