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



Reply via email to