[PATCH] Make random/hash director exhaust the backend list when looking for healthy backend.
Martin Blix Grydeland
martin at varnish-software.com
Mon Sep 1 13:06:14 CEST 2014
On 29 August 2014 15:10, Federico Schwindt <fgsch at lodoss.net> wrote:
> Hi,
>
> Any reason not to use rr->vd->n_backend directly as the round-robin
> director does?
>
The n_backend of the vdir.[ch] is opaque to the director implementations. I
added the new attribute to keep it that way.
Martin
>
>
> On Fri, Aug 29, 2014 at 1:48 PM, Martin Blix Grydeland <
> martin at varnish-software.com> wrote:
>
>> Fixes: #1575
>> ---
>> bin/varnishtest/tests/r01575.vtc | 56
>> ++++++++++++++++++++++++++++++++++++++++
>> lib/libvmod_directors/hash.c | 6 ++---
>> lib/libvmod_directors/random.c | 6 ++---
>> lib/libvmod_directors/vdir.c | 2 +-
>> 4 files changed, 63 insertions(+), 7 deletions(-)
>> create mode 100644 bin/varnishtest/tests/r01575.vtc
>>
>> diff --git a/bin/varnishtest/tests/r01575.vtc
>> b/bin/varnishtest/tests/r01575.vtc
>> new file mode 100644
>> index 0000000..11c82c1
>> --- /dev/null
>> +++ b/bin/varnishtest/tests/r01575.vtc
>> @@ -0,0 +1,56 @@
>> +varnishtest "#1575 - random director exhaust backend list"
>> +
>> +# Add 5 backends to a random director, with the 5th having very low
>> weight.
>> +# Mark the first 4 sick, and make sure that the 5th will be selected.
>> +
>> +server s1 {
>> + rxreq
>> + txresp
>> +} -start
>> +
>> +server s2 {
>> + rxreq
>> + txresp
>> +} -start
>> +
>> +server s3 {
>> + rxreq
>> + txresp
>> +} -start
>> +
>> +server s4 {
>> + rxreq
>> + txresp
>> +} -start
>> +
>> +server s5 {
>> + rxreq
>> + txresp
>> +} -start
>> +
>> +varnish v1 -vcl+backend {
>> + import ${vmod_directors};
>> + sub vcl_init {
>> + new rd = directors.random();
>> + rd.add_backend(s1, 10000);
>> + rd.add_backend(s2, 10000);
>> + rd.add_backend(s3, 10000);
>> + rd.add_backend(s4, 10000);
>> + rd.add_backend(s5, 1);
>> + }
>> +
>> + sub vcl_backend_fetch {
>> + set bereq.backend = rd.backend();
>> + }
>> +} -start
>> +
>> +varnish v1 -cliok "backend.set_health s1 sick"
>> +varnish v1 -cliok "backend.set_health s2 sick"
>> +varnish v1 -cliok "backend.set_health s3 sick"
>> +varnish v1 -cliok "backend.set_health s4 sick"
>> +
>> +client c1 {
>> + txreq
>> + rxresp
>> + expect resp.status == 200
>> +} -run
>> diff --git a/lib/libvmod_directors/hash.c b/lib/libvmod_directors/hash.c
>> index afef7ed..090039f 100644
>> --- a/lib/libvmod_directors/hash.c
>> +++ b/lib/libvmod_directors/hash.c
>> @@ -47,7 +47,7 @@ struct vmod_directors_hash {
>> unsigned magic;
>> #define VMOD_DIRECTORS_HASH_MAGIC 0xc08dd611
>> struct vdir *vd;
>> - unsigned nloops;
>> + unsigned n_backend;
>> struct vbitmap *vbm;
>> };
>>
>> @@ -64,7 +64,6 @@ vmod_hash__init(const struct vrt_ctx *ctx, struct
>> vmod_directors_hash **rrp,
>> AN(rr);
>> rr->vbm = vbit_init(8);
>> AN(rr->vbm);
>> - rr->nloops = 3; //
>> *rrp = rr;
>> vdir_new(&rr->vd, vcl_name, NULL, NULL, rr);
>> }
>> @@ -90,6 +89,7 @@ vmod_hash_add_backend(const struct vrt_ctx *ctx,
>> CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
>> CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_HASH_MAGIC);
>> (void)vdir_add_backend(rr->vd, be, w);
>> + rr->n_backend++;
>> }
>>
>> VCL_BACKEND __match_proto__()
>> @@ -120,6 +120,6 @@ vmod_hash_backend(const struct vrt_ctx *ctx, struct
>> vmod_directors_hash *rr,
>> r = vbe32dec(sha256);
>> r = scalbn(r, -32);
>> assert(r >= 0 && r <= 1.0);
>> - be = vdir_pick_be(rr->vd, r, rr->nloops);
>> + be = vdir_pick_be(rr->vd, r, rr->n_backend);
>> return (be);
>> }
>> diff --git a/lib/libvmod_directors/random.c
>> b/lib/libvmod_directors/random.c
>> index 22f0bb9..8ae36a7 100644
>> --- a/lib/libvmod_directors/random.c
>> +++ b/lib/libvmod_directors/random.c
>> @@ -45,7 +45,7 @@ struct vmod_directors_random {
>> unsigned magic;
>> #define VMOD_DIRECTORS_RANDOM_MAGIC 0x4732d092
>> struct vdir *vd;
>> - unsigned nloops;
>> + unsigned n_backend;
>> struct vbitmap *vbm;
>> };
>>
>> @@ -68,7 +68,7 @@ vmod_rr_getfd(const struct director *dir, struct
>> busyobj *bo)
>> CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_RANDOM_MAGIC);
>> r = scalbn(random(), -31);
>> assert(r >= 0 && r < 1.0);
>> - be = vdir_pick_be(rr->vd, r, rr->nloops);
>> + be = vdir_pick_be(rr->vd, r, rr->n_backend);
>> if (be == NULL)
>> return (NULL);
>> return (be->getfd(be, bo));
>> @@ -87,7 +87,6 @@ vmod_random__init(const struct vrt_ctx *ctx, struct
>> vmod_directors_random **rrp,
>> AN(rr);
>> rr->vbm = vbit_init(8);
>> AN(rr->vbm);
>> - rr->nloops = 3; //
>> *rrp = rr;
>> vdir_new(&rr->vd, vcl_name, vmod_rr_healthy, vmod_rr_getfd, rr);
>> }
>> @@ -113,6 +112,7 @@ vmod_random_add_backend(const struct vrt_ctx *ctx,
>> CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
>> CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_RANDOM_MAGIC);
>> (void)vdir_add_backend(rr->vd, be, w);
>> + rr->n_backend++;
>> }
>>
>> VCL_BACKEND __match_proto__()
>> diff --git a/lib/libvmod_directors/vdir.c b/lib/libvmod_directors/vdir.c
>> index 12268eb..aae7a14 100644
>> --- a/lib/libvmod_directors/vdir.c
>> +++ b/lib/libvmod_directors/vdir.c
>> @@ -186,7 +186,7 @@ vdir_pick_be(struct vdir *vd, double w, unsigned
>> nloops)
>> nbe = vd->n_backend;
>> assert(w >= 0.0 && w < 1.0);
>> vdir_lock(vd);
>> - for (l = 0; nbe > 0 && tw > 0.0 && l <nloops; l++) {
>> + for (l = 0; nbe > 0 && tw > 0.0 && l < nloops; l++) {
>> u = vdir_pick_by_weight(vd, w * tw, vbm);
>> be = vd->backend[u];
>> CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
>> --
>> 2.1.0.rc1
>>
>>
>> _______________________________________________
>> varnish-dev mailing list
>> varnish-dev at varnish-cache.org
>> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
>>
>
>
--
<http://varnish-software.com>*Martin Blix Grydeland*
Senior Developer | Varnish Software AS
Cell: +47 21 98 92 60
We Make Websites Fly!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.varnish-cache.org/lists/pipermail/varnish-dev/attachments/20140901/e7cf313d/attachment.html>
More information about the varnish-dev
mailing list