]> err.no Git - varnish/commitdiff
Fix the broken logic in the random directors picking routine.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 5 Nov 2008 12:51:51 +0000 (12:51 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 5 Nov 2008 12:51:51 +0000 (12:51 +0000)
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

index 7241899a8f11a1fcc667a389a5f9a4756124735d..f616efedee7e66a6774f7035d277a2158ad2cb5d 100644 (file)
@@ -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);