Good point. Then this looks like I had in mind. OK for me.
On Mon, Sep 1, 2014 at 12:06 PM, Martin Blix Grydeland < [email protected]> wrote: > > On 29 August 2014 15:10, Federico Schwindt <[email protected]> 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 < >> [email protected]> 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 >>> [email protected] >>> 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! >
_______________________________________________ varnish-dev mailing list [email protected] https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
