Upgrading to Varnish-Cache 8.0

This document only lists breaking changes that you should be aware of when upgrading from Varnish-Cache 7.x to 8.0. For a complete list of changes, please refer to the change log or Changes in Varnish-Cache 8.0.

varnishd

Unknown HTTP methods handling

In previous versions of Varnish, requests with an unknown/unsupported HTTP method were by default piped to the backend. Starting with Varnish 8.0, the default behaviour for such requests is to return a synthetic 501 response and close the connection. Handling of custom HTTP methods can of course still be implemented in your VCL.

Parameter aliases

It is no longer possible to set a parameter alias as read only, instead the actual parameter that it refers to should be set directly.

Other changes in varnishd

The Content-Length response header is now also sent in response to all HEAD requests.

Request body read failures now result in a 400 response status.

Bans

The default value of the ban_any_variant parameter was changed to 0. This means that during a lookup, only the matching variants of an object will be evaluated against the ban list. As a side effect, variants that are rarely requested may never get a chance to be tested against req based bans, which can lead to an accumulation of bans over time. In such cases, it is recommended to set ban_any_variant to a higher value. You can also consider using the new obj.last_hit ban variable to evict such objects.

vmod_std changes

The VMOD functions std.real2integer(), std.real2time(), std.time2integer() and std.time2real() have been removed. They had been marked deprecated since Varnish Cache release 6.2.0 (2019-03-15).

The plug-in replacements for these functions are:

std.real2integer():

std.integer(real=std.round(...), fallback=...)

std.real2time():

std.time(real=std.round(...), fallback=...)

std.time2integer():

std.integer(time=..., fallback=...)

std.time2real():

std.real(time=..., fallback=...)

Upgrade notes for VMOD developers

VRT_VSC_Alloc() was renamed to VRT_VSC_Allocv() and a new version of VRT_VSC_Alloc() that takes a va_list argument was reintroduced. This makes it consistent with our naming conventions.

struct strands and struct vrt_blob have become mini objects. Both are usually created through existing VRT functions, but where they are managed specifically, they should now be initialized / allocated with:

  • INIT_OBJ(strands, STRANDS_MAGIC) / ALLOC_OBJ(strands, STRANDS_MAGIC)

  • INIT_OBJ(blob, VMOD_BLOB_MAGIC) / ALLOC_OBJ(blob, VMOD_BLOB_MAGIC)

The already deprecated functions VRT_{Add,Remove}_{VDP,VFP} have been removed from VRT. They had already been replaced by VRT_AddFilter() and VRT_RemoveFilter().

eof