|
@@ -30,6 +30,11 @@
|
|
|
* server is dead or overloaded, the load balancer can bypass the cache
|
|
|
* server and send requests to the original server directly.
|
|
|
*
|
|
|
+ * The weight destination attribute can be used to control the
|
|
|
+ * distribution of connections to the destinations in servernode. The
|
|
|
+ * greater the weight, the more connections the destination
|
|
|
+ * will receive.
|
|
|
+ *
|
|
|
*/
|
|
|
|
|
|
#define KMSG_COMPONENT "IPVS"
|
|
@@ -99,9 +104,11 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
|
|
|
struct ip_vs_sh_bucket *b;
|
|
|
struct list_head *p;
|
|
|
struct ip_vs_dest *dest;
|
|
|
+ int d_count;
|
|
|
|
|
|
b = tbl;
|
|
|
p = &svc->destinations;
|
|
|
+ d_count = 0;
|
|
|
for (i=0; i<IP_VS_SH_TAB_SIZE; i++) {
|
|
|
if (list_empty(p)) {
|
|
|
b->dest = NULL;
|
|
@@ -113,7 +120,16 @@ ip_vs_sh_assign(struct ip_vs_sh_bucket *tbl, struct ip_vs_service *svc)
|
|
|
atomic_inc(&dest->refcnt);
|
|
|
b->dest = dest;
|
|
|
|
|
|
- p = p->next;
|
|
|
+ IP_VS_DBG_BUF(6, "assigned i: %d dest: %s weight: %d\n",
|
|
|
+ i, IP_VS_DBG_ADDR(svc->af, &dest->addr),
|
|
|
+ atomic_read(&dest->weight));
|
|
|
+
|
|
|
+ /* Don't move to next dest until filling weight */
|
|
|
+ if (++d_count >= atomic_read(&dest->weight)) {
|
|
|
+ p = p->next;
|
|
|
+ d_count = 0;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
b++;
|
|
|
}
|