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. --- include/types/server.h | 1 + src/backend.c | 2 ++ 2 files changed, 3 insertions(+)
diff --git a/include/types/server.h b/include/types/server.h index ce13820..5d89212 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 faf872c..573f054 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; } } -- 2.9.3