Hey guys,<br><br>Could this be one topic for VUG3 ? :D<br><br>Cheers,<br><br><div class="gmail_quote">On Mon, Oct 4, 2010 at 10:34 AM, Nils Goroll <span dir="ltr"><<a href="mailto:slink@schokola.de">slink@schokola.de</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hi,<br>
<br>
I've had a first discussion with phk on IRC. IIUC, his main concern was that<br>
introducing the new states & VCL procedures would increase complexity and raise<br>
the entry barrier, in particular with regard to users wanting to (easily)<br>
customize the default vcl.<br>
<br>
I will elaborate on the reasons for the proposed solution.<br>
<br>
a) vcl_stale()<br>
--------------<br>
<br>
The alternative we've discussed on IRC is to fall into vcl_miss(): If an obj<br>
eligible for refresh was found, default backend conditional request headers were<br>
added to bereq, and vcl_miss() would see obj. It wouldn't for the current case<br>
(a real miss). To avoid a backend conditional request, admins could remove the<br>
conditional headers (If-...) from bereq. return(refresh) wouldn't exist.<br>
<br>
Here's my subjective perspective on why vcl_stale() would make sense:<br>
<br>
- Without vcl_stale(), the semantics of vcl_miss() would mean "I have not found<br>
  an object eligible for delivery, but might have found one for refresh", which<br>
  I believe will confuse users more than help.<br>
<br>
  Mostly, this does open up a whole lot of oddities and questions:<br>
<br>
  - vcl_miss would see obj only if it was a "stale miss"<br>
<br>
    Odd: What would obj.status return for a "real miss"?<br>
<br>
  - cnt_miss could prepare bereq.http.If-... headers only if it was a "stale<br>
    miss"<br>
<br>
  - We would be able to return (deliver) for a "stale miss", but not for a real<br>
    miss: What do we do here? We can't decide on the correctness of the VCL<br>
    at compile time. Would return (deliver) fall back to a return (fetch)<br>
    is it's a "real miss"?<br>
<br>
- Users would need to put more conditionals into vcl_miss for special handling<br>
  of "stale" cases, à la:<br>
<br>
  if (obj) {<br>
        # do stale case handling<br>
  } else {<br>
        # existing code<br>
  }<br>
<br>
Depending on whether we want to default to the new or current behavior, a<br>
default vcl_stale() would look like:<br>
<br>
vcl_stale() {<br>
        return (refresh);<br>
}<br>
<br>
or<br>
<br>
vcl_stale() {<br>
        call vcl_miss;<br>
}<br>
<br>
<br>
<br>
If we put the mechanics into vcl_miss, retaining current behavior would need<br>
something like this with a full backend conditional:<br>
<br>
vcl_miss() {<br>
        if (obj) {<br>
                unset bereq.http.If-Match;<br>
                unset bereq.http.If-Modified-Since;<br>
                unset bereq.http.If-None-Match;<br>
                unset bereq.http.If-Range;<br>
                unset bereq.http.If-Unmodified-Since;<br>
        }<br>
}<br>
<br>
<br>
My personal impression is that vcl_stale would help retain clarity rather than<br>
complicate things, in particular because it would help to limit additional<br>
processing to the cases when it's actually needed.<br>
<br>
b) vcl_refresh()<br>
----------------<br>
<br>
The alternative to vcl_refresh() would be to put additional logic into vcl_fetch().<br>
<br>
Similar to the stale case, we would want to have access to the original object<br>
in the cache and the beresp from the refresh, so obj would be available only if<br>
vcl_refresh was entered with (beresp.status == 304).<br>
<br>
<br>
<br>
We really want to retain clarity and not introduce unneeded additional<br>
complexity. I believe that introducing more VCL states and procedures would help<br>
to achieve this, in particular because the preconditions for each case were<br>
clear and visibility of a cache object was well defined.<br>
<br>
Thanks, Nils<br>
<br>
_______________________________________________<br>
varnish-dev mailing list<br>
<a href="mailto:varnish-dev@varnish-cache.org">varnish-dev@varnish-cache.org</a><br>
<a href="http://lists.varnish-cache.org/mailman/listinfo/varnish-dev" target="_blank">http://lists.varnish-cache.org/mailman/listinfo/varnish-dev</a><br>
</blockquote></div><br>