Converting a Varnish 3.0 VMOD to 4.0

So we’re getting closer to releasing the first proper 4.0 version of Varnish Cache. One of the things we need to fix is to get all the vmod writers to make sure their vmod works with the new version.

Here are my notes from doing just that, in the hope to make it simpler for others.

In 4.0, you don’t need the source tree of Varnish any more. The include files will be enough, and pkg-config will find them for you.

Make sure that /usr/lib/pkgconfig/varnishapi.pc and /usr/share/aclocal/varnish.m4 exists. If you installed Varnish in the standard path/prefix, that should work out of the box. Otherwise, you might to add some symlinks for pkg-config and automake to find the source. (I need multiple varnishd versions when debugging customer problems, so I let them live in /opt/varnishX.Y/ on my laptop)

Pull/merge the new files from the master branch of libvmod-example.

Header files: remove bin/varnishd/cache.h and add cache/cache.h.

Vmod functions are now called with a vrt context as first argument. %s/struct sess \*sp/const struct vrt_ctx \*ctx/g

The old sess struct has been split, some data is in vrt_ctx->req, and some is in vrt_vtx->req->sp. Look up what is where in cache/cache.h. 

I’ve put up the 3.0->4.0 diff for vmod_policy.c as a gist:

There was a bit trouble of finding varnishtest, as src/Makefile was missing the reference entirely. I just fixed it by hand for now. Another thing for the 4.0 todolist, then.

And finally; 

lkarsten@immer:~/work/libvmod-policy/src$ make check
/opt/varnish/bin/varnishtest -Dvarnishd=/opt/varnish/sbin/varnishd -Dvmod_topbuild=/home/lkarsten/work/libvmod-policy tests/test01.vtc
# top TEST tests/test01.vtc passed (1.574)


I have a working Varnish 4.0 vmod. :-D

This entry was posted in Uncategorized and tagged , , . Bookmark the permalink.

2 Responses to Converting a Varnish 3.0 VMOD to 4.0

  1. Dag Haavi Finstad says:

    Great stuff, Lasse!

    I recently converted the digest vmod to Varnish 4.0, here’s the commit:

    Other things of note that I ran into:
    – Since the tp1 release, the .vcc format has seen some changes. You can now write documentation inline in the .vcc file, and a .rst and a .man.rst will be generated from it. A $ sign is used to discern between regular vmod .vcc definitions and documentation entries. See the std vmod’s for an example.

    – Workspaces: ctx->ws should be used in place of 3.0’s sp->ws. A slight gotcha here is that there still is a ‘ws’ member in struct sess, although this is only used for storing the client’s address and port numbers, and limited to a measly 384 bytes. ctx->ws will be set to a different value depending on which vcl function your vmod routine was invoked from (client side vs backend side). To increase available workspace you will now have to increase one or both of workspace_client/workspace_backend, which is different from 3.0 where you only had to worry about sess_workspace. This is related to how backend fetches in 4.0 are async.

    – There are now typedefs for mapping VCL types to C types. Use VCL_STRING/VCL_DURATION/etc. See vrt.h

    Cheers. :-)

  2. Dag Haavi Finstad says:

    To add to this, in order to set up your environment appropriately when you have varnish4 installed under a non-standard directory, source the following:

    export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
    export ACLOCAL_PATH=$PREFIX/share/aclocal
    export PATH=$PREFIX/bin:$PREFIX/sbin:$PATH

    where PREFIX is set to whatever you used as –prefix when running ./configure.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s