Varnish still 503ing after adding grace to VCL

Drew Smathers drew.smathers at gmail.com
Wed Mar 9 01:23:19 CET 2011


On Tue, Mar 8, 2011 at 3:51 PM, Per Buer <perbu at varnish-software.com> wrote:
> Hi Drew, list.
> On Tue, Mar 8, 2011 at 9:34 PM, Drew Smathers <drew.smathers at gmail.com>
> wrote:
>>
>> Sorry to bump my own thread, but does anyone know of a way to set
>> saintmode if a backend is down, vs. up and misbehaving (returning 500,
>> etc)?
>>
>> Also, I added a backend probe and this indeed caused grace to kick in
>> once the probe determined the backend as sick.I think the docs should
>> be clarified if this isn't a bug (grace not working without probe):
>>
>> http://www.varnish-cache.org/docs/2.1/tutorial/handling_misbehaving_servers.html#tutorial-handling-misbehaving-servers
>
> Check out the trunk version of the docs. Committed some earlier today.
>

Thanks, I see a lot is getting

>>
>> Finally it's somewhat disconcerting that in the interim between a
>> cache expiry and before varnish determines a backend as down (sick) it
>> will 503 - so this could affect many clients during that window.
>> Ideally, I'd like to successfully service requests if there's an
>> object in the cache - period - but I guess this isn't possible now
>> with varnish?
>
> Actually it is. In the docs there is a somewhat dirty trick where set a
> marker in vcl_error, restart and pick up on the error and switch backend to
> one that is permanetly down. Grace kicks in and serves the stale content.
> Sometime post 3.0 there will be a refactoring of the whole vcl_error
> handling and we'll end up with something a bit more elegant.
>

Well a dirty trick is good enough if makes a paying customer for me.  :P

This is working perfectly now. I would suggest giving an example of
"magic marker" mentioned in the document which mentions the trick
(http://www.varnish-cache.org/docs/trunk/tutorial/handling_misbehaving_servers.html).
 Here's a stripped down version of my VCL incorporating the trick:

backend webapp {
    .host = "127.0.0.1";
    .port = "8000";
    .probe = {
        .url = "/hello/";
        .interval = 5s;
        .timeout = 1s;
        .window = 5;
        .threshold = 3;
    }
}

/* A backend that will always fail. */
backend failapp {
    .host = "127.0.0.1";
    .port = "9000";
    .probe = {
        .url = "/hello/";
        .interval = 12h;
        .timeout = 1s;
        .window = 1;
        .threshold = 1;
    }
}

sub vcl_recv {

   if (req.http.X-Varnish-Error == "1") {
       set req.backend = failapp;
       unset req.http.X-Varnish-Error;
   } else {
       set req.backend = webapp;
   }

   if (! req.backend.healthy) {
       set req.grace = 24h;
   } else {
       set req.grace = 1m;
   }
}

sub vcl_error {
    if ( req.http.X-Varnish-Error != "1" ) {
        set req.http.X-Varnish-Error = "1";
        return (restart);
    }

}

sub vcl_fetch {
   set beresp.grace = 24h;
}




More information about the varnish-misc mailing list