Skip to content

Instantly share code, notes, and snippets.

@rezan
Last active August 30, 2019 13:00
Show Gist options
  • Save rezan/55d00e5d3839d4f28a51bf9d3dd87fdb to your computer and use it in GitHub Desktop.
Save rezan/55d00e5d3839d4f28a51bf9d3dd87fdb to your computer and use it in GitHub Desktop.
Serve stale on error
#
# Stale-If-Error (v1.0)
#
import std;
sub vcl_recv {
# First pass, clear SIE headers
if (!req.restarts) {
unset req.http.x-sie6-enabled;
unset req.http.x-sie6-abandon;
}
# SIE possible, attempt to serve fresh, skip vcl_recv
else if (req.restarts == 1 && req.http.x-sie6-enabled) {
set req.grace = 0s;
return (hash);
}
# SIE serve fresh failed, serve stale, skip vcl_recv
else if (req.http.x-sie6-abandon) {
set req.grace = 100y;
return (hash);
}
}
sub vcl_hit {
# Stale object found, attempt SIE
if (!req.restarts && obj.ttl < 0s && std.healthy(req.backend_hint)) {
set req.http.x-sie6-enabled = "true";
return (restart);
}
}
sub vcl_backend_fetch {
# Dont do SIE bgfetch on stale delivery
if (bereq.is_bgfetch && bereq.http.x-sie6-abandon) {
return (abandon);
}
}
sub vcl_backend_response {
# SIE and we got an error, attempt to serve stale
if (bereq.http.x-sie6-enabled && beresp.status >= 500) {
return (abandon);
}
}
sub vcl_backend_error {
# SIE and we got an error, attempt to serve stale
if (bereq.http.x-sie6-enabled) {
return (abandon);
}
}
sub vcl_synth {
# Backend SIE error, restart so we can attempt a stale delivery
if (req.http.x-sie6-enabled && resp.status == 503) {
unset req.http.x-sie6-enabled;
set req.http.x-sie6-abandon = "true";
return (restart);
}
}
# EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment