Changes in Varnish Cache 9.1
For information about updating your current Varnish deployment to the new version, see Upgrading to Varnish 9.1.
A more detailed and technical account of changes in Varnish Cache, with links to issues that have been fixed and pull requests that have been merged, may be found in the change log.
varnishd
Parameters
varnishd -x parameter-jsonhas been added to output the parameter documentation in JSON format. (4378)varnishdnow checks for an already running instance before modifying the working directory.-Cshould not be used together with-n.The
esi_ignore_https,esi_disable_xml_check,esi_ignore_other_elementsandesi_remove_bomfeature flags can now be overridden per response with the newberesp.esi_ignore_https,beresp.esi_disable_xml_check,beresp.esi_ignore_other_elementsandberesp.esi_remove_bomvariables. (4518)Object references are now retained until the end of a client task, such that object attributes accessed from VCL remain valid across restarts without being copied to the workspace. Consequently,
max_restartsandmax_retriesgained upper limits of 32766 and 65534, respectively. (4269)storage.Synth, as configured through the-sSynth=...varnishdstartup parameter is now the defaultresp.storageused for synthetic responses created invcl_synth{}. (4492)The lock witness facility is now disabled at compile time by default and needs to be enabled with the
--enable-witnessconfigureoption. (4574). Note that even if enabled at compile time, it still also needs to be activated at runtime usingparam.set debug +witnessas before.
Protocol framing fixes:
HTTP/1 message framing checks have been tightened (4581):
- Backend responses with invalid body framing now fail the fetch.
- Multiple
Transfer-Encodingfields are now considered as a whole, such that duplicatechunkedcodings are refused. - Multiple
Content-Lengthfields and values are now accepted if they all agree (leading zeroes are tolerated) and consolidated into a single canonical header, any disagreement is refused. Transfer-Encodingon an HTTP/1.0 request is now refused. For HTTP/1.0 backend responses, the newvcl_beresp_http10built-in subroutine abandons the fetch, which VCL can override.- The backend connection is now closed when the range check of a response fails, to avoid reusing a connection with an unread body.
- An existing, correct
Connectionresponse header is no longer overwritten when closing: other tokens are preserved andcloseorkeep-aliveare added as needed. If aConnectionwas not present, or was incorrect, we create a new, correct one. (4498)
Other HTTP-related improvements
HTTP header parsing now only accepts SP and TAB as optional white space. (4583)
Range processing is now only applied to
GETrequests as mandated by RFC 9110, and the builtin VCL removes theRangeheader from other requests. (4533)Fetching of HTTP/1.1 chunked bodies has been optimized: Chunked body fetches now use readahead instead of the previous single byte read operations which were wasteful and inefficient. (4508)
Improved support for delivery processors (VDPs) changing the length of a request body:
Content-Lengthis rewritten or removed and chunked encoding is used as required.The range VDP now removes any existing
Content-Rangeheader to avoid duplicates.A deficiency in HTTP/2 request parsing has been fixed by properly comparing pseudo-header names instead of doing a prefix match. (VSV00019)
Handling of
Connection: closehas been made more consistent if theConnectionheader also contains other tokens. (4495)
Ban improvements
- The
obj.hfm,obj.hfp, andobj.uncacheableban variables have been added to allow banning hit-for-miss and hit-for-pass and uncachable (both) objects. (4532)
Synth storage engine
- A new
synthstorage engine has been added, which avoids copying data for synthetic response bodies by referencing the constituents directly. It is used by default as theSynthstorage. (4365)
VCC fixes
- VCC now refuses empty quoted header names as in
req.http."", which could previously result in a C compiler error. (4577) - Fixed a VCC bug where
includeof a BLOB literal file could fail with a spurious "Missing colon" error.
Build and compile-related improvements
make installnow honoursDESTDIRwhen creatingVARNISH_STATE_DIR. (4512)During build, the new
configureoption--with-statedirnow allows to set theVARNISH_STATE_DIRdirectly, which is the default forVARNISH_DEFAULT_N, which, in turn, is the default for the-nargument tovarnishdandvarnish{log,ncsa,hist,top}. (4483)The default for
VARNISH_STATE_DIRhas been changed back to${localstatedir}/varnish. (4483)
Other fixes & improvements
Worker pool shutdown has been reworked: Acceptor tasks and waiters now terminate promptly, dying pools no longer starve queued tasks and worker threads are waited for before a pool is dismantled. The worker process now ignores
SIGUSR1, which is used internally to interrupt blockingaccept(2)calls. (4538).PROXY v2 parsing now validates the length of the CRC32C TLV, avoiding an out-of-bounds read. (4560)
Fixed the alphabet of the built-in base64 encoder used when converting BLOBs to strings. (4522)
Starting sub-processes has become faster on systems with a high file descriptor limit by only closing file descriptors which are actually open. (3891)
A previous fix regarding
false/truedefaults for VMOD functionBOOLarguments was incomplete and has been corrected. (4452)Fixed a manager abort when the worker process failed to cool a VCL being discarded, which also prevented
auto_restartfrom taking effect.(4563)
Fixed a panic when a delivery processor (VDP) failed to initialize before allocating the private pointer. This changes the VDP api in that a VDP that returns non-zero from its
.init()callback will no longer see its.fini()method called, which implies that all failure scenarios during.init()must clean up any allocated data before returning. (4539)Fixed a bug in the
pollwaiter which could delay handling of events whose deadline had already passed. (4561)When the worker process terminates,
varnishdnow reports resource usage in theChild dies usr=%f sys=%fmessage,usrandsysbeing the "user" and "system" time used as reported bygetrusage().Worker pools are now shut down during a worker process stop as initiated by
varnishadm stop. This improves shutdown speed by releasing VCL references earlier.The behavior now matches that with the
drop_poolsexperimental parameter set, which has been removed.Failed objects no longer get added to LRU. (4428)
IPv4 compatible and IPv4 mapped IPv6 addresses now get rewritten to IPv4 addresses, which is relevant for ACL matches in particular. (4474)
A workspace buffer overflow vulnerability was fixed in the
.upper()and.lower()VCL string type methods. (VSV00020)
Changes to VCL
The
req0.method,req0.url,req0.protoandreq0.http.*variables have been added for read access to the request almost exactly as it was originally received. Invrt.h,struct vrt_ctxgained thehttp_req0member andenum gethdr_egainedHDR_REQ0.Setting
req.max_age = 0snow forces a cache miss with request coalescing, where it previously had no effect. (4041)The HTTP
QUERYmethod has been added to the well known request methods and is passed by default in the builtin VCL. (4531)The new
resp.esi_include_onerrorvariable allows to override theesi_include_onerrorfeature flag invcl_deliver {}. (4054)The
synthetic()VCL action has been removed. Since Varnish Cache 5.0.0, body data can be created by settingberesp.bodyinvcl_backend_error {}and by settingresp.bodyinvcl_synth {}, and these continue to be available as the one way to create body data, as in these examples:set resp.body = "string" + " more strings";set resp.body += " appending even " + "more strings";set resp.body = :blob:;set resp.body += :blobappend:;
These examples equally work on
beresp.bodyinvcl_backend_error {}.The direct replacement for
synthetic(<string>);isset resp.body += <string>;invcl_synth {}andset beresp.body += <string>;invcl_backend_error {}.The only difference in behavior is that
synthetic(<nullstring>)would create the string(null)for<nullstring>being aNULLpointer internally, whileset resp.body = <nullstring>creates the empty string""andset resp.body += <nullstring>is a NOOP. (4503)A new
resp.storageVCL variable available fromvcl_synth{}was added to select which storage the synth response body gets created on. (4358)
VMODs
vmod_std
Fixed a bug causing
std.fileread()to panic when pointed at a 0-length file. (4557)The argument to
std.rollback()is now obsolete and ignored, the appropriate headers to be rolled back are now inferred from the call site. This also fixes a panic whenresporberespwas passed. (4566)std.collect_all()has been added to combine all multiple headers ofreq,resp,bereqorberespaccording to the HTTP RFCs:Set-Cookieis not combined,Cookieis combined with"; "and all other headers with", ".Header combining by
std.collect()is now visible in the log.std.strftime()now errors out it given a NULL format string. (4551)Fixed a potential buffer over-read when parsing HTTP dates. (4554)
std.getenv()gained an optional fallback argument which is returned if the environment variable is not set. (4527)
vmod_math
math.strfromd(): format strings cannot contain extra data after the formatter. (4547)
vmod_blob
blob.transcode()now limits its stack usage by decoding large inputs piecemeal, avoiding a potential stack overflow.blob.sub()now properly errors out if given a negative offset or size. (4549)
varnishlog & varnishstat
HttpGarbagelog records now contain the offending data rather than just the request method.- HTTP/1 messages rejected for invalid body framing now get a
BogoHeaderlog record naming the offending field. - Malformed lines in the VSM
_.indexfile are now reported with a meaningful diagnostic instead of a bare assertion failure in VSM readers likevarnishstatandvarnishlog. (4569) - Counters for backend connection closes have been added:
MAIN.backend_closed,MAIN.backend_closed_errand theMAIN.bc_*close reason counters that are a subset ofsc_*session counters, as well as the equivalent per-backendVBE.*.closed,VBE.*.closed_errand close reason counters. (4337) varnish{log,ncsa,hist,top}all gained the-0dry-run argument that allows validating command line arguments before running them for real. (4493)
varnishadm
varnishadmnow only uses libedit if both stdin and stdout are terminals.The
-x workdiroption has been added tovarnishadmto print the default work directory and exit. This is useful for tools that need to discover the VSM location in most setups. (4494)tls.cert.list -jno longer returns an empty body with a200status when the child process is not running; it now returns an empty JSON array ([]).
varnishtest & vtest
varnishtestgained theVTEST_VARNISH_VCL_PREPENDenvironment variable to inject VCL code into all VCL loaded byvarnishinstances.Varnish can now be built without the vtest2 git submodule and instead with an externally provided vtest program, as installed by running
DESTDIR=/prefix make installin the Vtest2 repository https://code.vinyl-cache.org/vtest/VTest2 (#4398)The Varnish specific test commands
varnish,logexpectandvsmhave been moved to a vtest extension.For a build with the submodule, both a
varnishtestprogram andvtestsymlink continue to be built and installed as monolithic binaries which always include the extension.For a build without the submodule (with an external
vtestprogram), avarnishtestwrapper is built, which sets up the right command line arguments and callsvtest.This is done to hopefully achieve a smooth transition, until we plan to eventually remove
varnishtestand wholly replace it withvtest -E libvtest_ext_varnish.so(or the equivalent for automake), which is what thevarnishtestwrapper already calls.The following vtest
featuretests have been moved tovcache_builtwithin the Varnish Cache VTest extension:64bit,persistent_storage,coverage,asan,msan,tsan,ubsan,sanitizer,workspace_emulatorandwitness.In the Varnish Cache VTest extension, the log output of SLT_F_UNSAFE log records has been changed to escape unprintable characters as
\xFF, FF being the hexadecimal representation of the respective character.A simple perl script
tools/vtclog2logexp.shhas been added to help createlogexpcommands forvtestfrom its output.
Changes for developers and VMOD authors
We added infrastructure to easily build VMODs for multiple Varnish Cache based projects. Besides changing how VMOD builds discover such projects and configure themselves appropriately, we also added the
vcachecommand to the Varnish Cache VTest extension. (#4537)With the same goal,
cache/cache_vinyld.hhas been renamed tocache/cache_int.h.See Supporting multiple Varnish Cache based projects for details on how to migrate.
We also fixed the maxmimum version check in the
VCACHE_REQUIREmacro from inclusive to exclusive, matchingVARNISH_PREREQ's original documented behavior. SoVCACHE_REQUIRE([varnish], [9.0.0], [9.1.0])no longer implements "9.0.x OR 9.1.0" but rather "9.0.x".The
varnish-legacy.m4macro collection for VMOD builds has been removed. VMODs should migrate to using the macros fromvarnish.m4.The
LBODY_SETandLBODY_ADDcompatibility defines and thestruct VCL_confandstruct VSC_maindeclarations have been removed fromvrt.h.struct vmod_datahas moved tovmod_abi.h.The
debugstorage engine lost all parameters exceptdinitanddopen, as these are replaced by the above now.Likewise, the
debug.fragfetchhelper parameter has been removed,vtc.storage_frag()fills its place.VTIM_format()no longer usesgmtime_r(), which improves performance.The
Tstrcmp()macro has been removed fromvdef.h,Tstreq()is to be used for equality checks.The functions
VRT_synth_strands(),VRT_synth_blob(),VRT_synth_page()andVRT_Stv()have been removed from the runtime.STV_BanExport()no longer holds theban_mtx(3853)