> Easy one: you build the key from the request, while the vary header is a 
> response property. Therefore, Varnish can't know to put the varied headers 
> into the hash, because it doesn't have that information yet.

Of course! Makes perfect sense. But the documentation should make this crystal 
clear, if you ask me. Like a page titled "How is the cache key calculated?" 
which explains everything related to this. Like how the hash works, how the 
default implementation works, how to modify it, and how the backend response 
still can cause multiple different versions (like the Vary header, and maybe 
other so called "secondary keys"?), and how to modify that behavior. I also 
think it would make sense if this documentation also mentioned how all this 
information can be debugged using varnishlog or other tools.

Is there even an official word for this final "cache key"? "Hash" clearly isn't 
specific enough. I'm talking about a word that refers to the unique key that 
always corresponds to only a _single_ version of a cached object.


>Don't touch that guy! Varnish will ignore "accept-encoding" in "vary" because 
>it handles compression internally, and always forces "accept-encoding: gzip" 
>before entering vcl_backend_fetch. If your VCL mentions accept-encoding, it's 
>almost always wrong.

Sorry, I'm confused now... Don't touch _which_ guy? Our VCL doesn't contain 
anything regarding "Accept-Encoding". All I said was that the Vary header in 
the response from the backend is "Accept-Encoding". And the way I see it, this 
shouldn't be the cause of the strange problems we are seeing, since even when 
factoring in this, there should exist a matching cached object for me, and it 
should be served regardless of TTL or backend health as long as the grace 
hasn't expired (which it hasn't). Or is my reasoning flawed here, based on the 
VCL snippet in my original post? Can you think of a scenario where our VCL 
would return the synthetic 500 page even when there exists a cached objekt 
matching the hash and vary logic?


> The default VSL space is 80MB, which is "only" worth a few (tens of) 
> thousands requests, so yeah, it can be a short backlog.

Yeah, I think 80MB is a bit to small for us. Ideally we should be able to sit 
down on a Monday and troubleshoot problems that occured Friday evening, but 
that might require a way too big VSL space. But a few hundred MB should be fine.


> The problem is that you have to be recording when the initial request goes 
> through. But, if you have then, cache hits will show the VXID of that first 
> request in their "x-varnish" header, and you can find it this way 
> ("varnishlog -r log.bin -q 'vxid == THE_VXID'")

Well, would it really be a cache hit? The main transaction I'm looking for is 
the first transaction for a specific path (in this case, "/") where Varnish 
served the synthetic 500 page. And then I would also like to see the closest 
preceding transaction for that same page, where the hash (and the Vary logic) 
matches the main transaction mentioned above.

Picture for example this scenario:

1. Request for "/", with with a certain hash and "secondary key" (from the 
"Accept-Encoding"). Data is fetched from backend and stored in cache.
2. Lots of other, irrelevant requests, including requests for "/" but with a 
different hash and/or "Accept-Encoding"
3. Request for "/" that uses the cached data from point 1 above
4. Lots of other, irrelevant requests, same as 2 above, but now in such big 
numbers that the backend servers start having problems
5. Request for "/" with same hash and/or "Accept-Encoding" as 1 above, but for 
some reason Varnish now returns the synthetic 500 page and puts it in the cache

The transaction log for request in step 5 is the main one I want to find, but 
also the transaction for step 3 and possibly step 1 as well. But the 
transaction for step 5 is the most interesting one, and I don't understand how 
that would be a cache hit while returning a fresh synthetic 500 error page.

Or are you saying that we can find "number 5" above by first finding some 
transaction later in the log, with a cache hit for the 500 page, and that 
transaction in turn points to "number 5" since that was the transaction that 
created the 500 response?

This makes me realize that when looking at past log data, ie using the "-d" 
parameter, or reading from a file, it looks for matching transactions/requests 
starting from the beginning. But in this kind troubleshooting I think it could 
be useful to also be able to search from the end and go backwards. Is that 
possible? So that if I use the "-" parameter to limit the output to a single 
transaction, it outputs the _last_ one instead of the first one.
_______________________________________________
varnish-misc mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-misc

Reply via email to