From 0960c201b55968b0606225034cc2831ff04bea03 Mon Sep 17 00:00:00 2001 From: phk Date: Wed, 5 Nov 2008 12:51:51 +0000 Subject: [PATCH] Fix the broken logic in the random directors picking routine. Drop the consistency check for health-changes, at the cost of a slight bias[1] for hosts before, or after, then one that changed health, according to how its health changed. Count all failures to pick against the retry count. Fixes #361 git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3359 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_dir_random.c | 47 +++++++------------ 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_dir_random.c b/varnish-cache/bin/varnishd/cache_dir_random.c index 7241899a..f616efed 100644 --- a/varnish-cache/bin/varnishd/cache_dir_random.c +++ b/varnish-cache/bin/varnishd/cache_dir_random.c @@ -66,9 +66,9 @@ struct vdi_random { static struct vbe_conn * vdi_random_getfd(struct sess *sp) { - int i, j, k; + int i, k; struct vdi_random *vs; - double r, s1, s2; + double r, s1; struct vbe_conn *vbe; CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); @@ -78,43 +78,32 @@ vdi_random_getfd(struct sess *sp) k = 0; for (k = 0; k < vs->retries; ) { - r = random() / 2147483648.0; /* 2^31 */ - assert(r >= 0.0 && r < 1.0); - + /* Sum up the weights of healty backends */ s1 = 0.0; - j = 0; - for (i = 0; i < vs->nhosts; i++) { - if (!vs->hosts[i].backend->healthy) - continue; - s1 += vs->hosts[i].weight; - j++; - } + for (i = 0; i < vs->nhosts; i++) + if (vs->hosts[i].backend->healthy) + s1 += vs->hosts[i].weight; - if (j == 0) /* No healthy hosts */ + if (s1 == 0.0) return (NULL); + /* Pick a random threshold in that interval */ + r = random() / 2147483648.0; /* 2^31 */ + assert(r >= 0.0 && r < 1.0); r *= s1; - s2 = 0; + s1 = 0.0; for (i = 0; i < vs->nhosts; i++) { if (!vs->hosts[i].backend->healthy) continue; - s2 += vs->hosts[i].weight; - if (r < s2) - break; - } - - if (s2 != s1) { - /* - * Health bit changed in an unusable way while we - * worked the problem. Usable changes are any that - * result in the same sum we prepared for. - */ - continue; + s1 += vs->hosts[i].weight; + if (r >= s1) + continue; + vbe = VBE_GetVbe(sp, vs->hosts[i].backend); + if (vbe != NULL) + return (vbe); + break; } - vbe = VBE_GetVbe(sp, vs->hosts[i].backend); - if (vbe != NULL) - return (vbe); k++; } return (NULL); -- 2.39.5