VCL not updated after updating ConfigMap when polling is enabled
Closed this issue · 1 comments
Describe the bug
When using -varnish-vcl-template-poll=true
and the VCL template is mounted from a ConfigMap
then mtime
of the mounted file does not change after saving new content to the ConfigMap
.
I'm not sure if this is a Kubernetes distro-specific problem but I can reproduce this reliably on my local k3d
setup with v1.27.4+k3s1
.
It seems to be related to the issue described in 2016 in the Kubernetes issue tracker kubernetes/kubernetes#24215 but it was closed without fixing. The fact that the problem was raised in the Kubernetes repo suggests it is a global issue and not distro-specific.
To Reproduce
- Install kube-httpcache on
k3d
managed cluster and use VCL polling (use-varnish-vcl-template-poll=true
) - Update ConfigMap which holds the VCL template with new VCL template content.
Expected behavior
Template should be rendered and Varnish should be reloaded with a new VCL after 15s (at most).
Environment:
k3d
withv1.27.4+k3s1
- kube-httpcache version:
v0.8.1
Configuration
Any valid VCL
Additional context
pkg/watcher/template_watch_poll.go
will launch a new gorutine with an infinite loop. On each tick, the loop is using os.Stat()
to get stat.ModTime()
. The path given to the os.Stat()
is actually a symlink to another symlink to the actual file. When the ConfigMap
is saved then, the mtime
of the file at the end of the symlink chain is updated but the first symlink mtime
does not change.
root@varnish-0:/etc/varnish# ls tmpl/ -al
total 0
drwxrwxrwt. 3 root root 100 Apr 12 15:52 .
drwxr-xr-x. 1 root root 28 Apr 12 13:05 ..
drwxr-xr-x. 2 root root 60 Apr 12 15:52 ..2024_04_12_15_52_00.648112414
lrwxrwxrwx. 1 root root 31 Apr 12 15:52 ..data -> ..2024_04_12_15_52_00.648112414
lrwxrwxrwx. 1 root root 23 Apr 12 13:05 default.vcl.tmpl -> ..data/default.vcl.tmpl
It looks like it was a problem with my setup. The modification time for the symlink is not changing but the function stat.ModTime()
seems to look at the symlink target and not the symlink itself. Closing.