Roadblock for Varnish 4 vmod_saintmode
Dag Haavi Finstad
daghf at varnish-software.com
Mon May 26 17:04:08 CEST 2014
On Mon, May 26, 2014 at 11:04 AM, Poul-Henning Kamp <phk at phk.freebsd.dk> wrote:
> In message <CAEh05VZpyTZq2pT5dAnmwEc5AZLurAfxSeznQ4BsWxWa=ie_DQ at mail.gmail.com>
> , Dag Haavi Finstad writes:
>
>>The way I envisioned it is purely on the fetch side. So 'saintmode' in
>>this case will be a tool that helps us avoid picking a backend for
>>certain URLs.
>
> So how exactly does that work ?
>
> Once you havn't picked the backend, what backend do you then use ?
>
> Does the saint director pick another one ? (by what algorithm ?)
The saintmode director is only a simple decorator around a single
backend. It will not pick a different backend by itself, it will
merely report as sick. If an object is found to be on its trouble list
in be->healthy(), it will be reported as sick. Likewise, be->getfd()
will return NULL and it will be a 503 if it ends up getting selected
anyway.
The policy of how a different backend is picked is left up to
whichever other director is in use, or by a vcl decision. I'll revisit
the previous example, with a few more comments added:
sub vcl_init {
# sm0 and sm1 represent separate backends, with each their
# separate trouble lists.
new sm0 = saintmode.saintmode(b0, 10);
new sm1 = saintmode.saintmode(b1, 10);
new rr = directors.round_robin();
rr.add_backend(sm0.backend());
rr.add_backend(sm1.backend());
# .backend() here returns a pointer to a 'struct director'
# representing that specific saintmode director
}
sub vcl_backend_fetch {
set bereq.backend = rr.backend();
# the round-robin director will evaluate be->healthy() upon
# picking a backend. The healthy() function in the selected saint
# mode dir will then report as sick in the case that the specific
# object is on its trouble list. The choice is then left to the
# r-r director to pick the next healthy backend.
}
sub vcl_backend_response {
if (beresp.status == 500) {
saintmode.blacklist(20s); # equivalent of 3.0's set
beresp.saintmode = 20s
return (retry);
# upon retry, the offending backend (saintmode dir) will
# report as sick.
# .blacklist() should be a function and not an object method,
# since when saintmode objects are used in a nested fashion like
# here, we wouldn't be able to tell which 'sm' object to invoke
# the .blacklist() method on. The .blacklist() function will be able to
# figure out which backend and hence saintmode object to use.
}
}
Regards,
--
Dag Haavi Finstad
Software Developer | Varnish Software AS
Mobile: +47 476 64 134
We Make Websites Fly!
More information about the varnish-dev
mailing list