[master] 5c2f7acdb vsc: Add an 'R' argument for required fields
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Mon Aug 31 16:00:08 UTC 2020
commit 5c2f7acdbe62559479bbdf74a1e715727cbe47f0
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Tue Aug 25 18:53:06 2020 +0200
vsc: Add an 'R' argument for required fields
Required fields work like inclusion filters, except that not matching
them doesn't have any consequence if no filter matched. They also take
precedence over regular filters.
Fixes #3394
diff --git a/bin/varnishstat/varnishstat.c b/bin/varnishstat/varnishstat.c
index 0d308055a..75c88311f 100644
--- a/bin/varnishstat/varnishstat.c
+++ b/bin/varnishstat/varnishstat.c
@@ -338,10 +338,10 @@ main(int argc, char * const *argv)
if (curses) {
if (has_f) {
- AN(VSC_Arg(vsc, 'f', "MGT.uptime"));
- AN(VSC_Arg(vsc, 'f', "MAIN.uptime"));
- AN(VSC_Arg(vsc, 'f', "MAIN.cache_hit"));
- AN(VSC_Arg(vsc, 'f', "MAIN.cache_miss"));
+ AN(VSC_Arg(vsc, 'R', "MGT.uptime"));
+ AN(VSC_Arg(vsc, 'R', "MAIN.uptime"));
+ AN(VSC_Arg(vsc, 'R', "MAIN.cache_hit"));
+ AN(VSC_Arg(vsc, 'R', "MAIN.cache_miss"));
}
do_curses(vd, vsc);
}
diff --git a/bin/varnishtest/tests/r03394.vtc b/bin/varnishtest/tests/r03394.vtc
new file mode 100644
index 000000000..750d6e414
--- /dev/null
+++ b/bin/varnishtest/tests/r03394.vtc
@@ -0,0 +1,9 @@
+varnishtest "varnishstat curses field exclusion"
+
+server s1 -start
+
+varnish v1 -vcl+backend "" -start
+
+process p1 -dump {varnishstat -n ${v1_name} -f '^VSB.*'} -start
+process p1 -expect-text 0 0 "MAIN.pools"
+process p1 -screen_dump -write q -wait
diff --git a/include/vapi/vsc.h b/include/vapi/vsc.h
index b4dda6c3c..ec6c2b92d 100644
--- a/include/vapi/vsc.h
+++ b/include/vapi/vsc.h
@@ -116,6 +116,7 @@ int VSC_Arg(struct vsc *, char arg, const char *opt);
* Handle standard stat-presenter arguments
* 'I' - field inclusion glob
* 'X' - field exclusion glob
+ * 'R' - required field glob
* 'f' - legacy field filter glob
*
* Return:
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 70ad3d507..f10dfc387 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -57,10 +57,12 @@ struct vsc_sf_mode {
const char *name;
unsigned include;
unsigned fail;
+ unsigned append;
};
-static struct vsc_sf_mode VSC_SF_INCLUDE[1] = {{"include", 1, 1}};
-static struct vsc_sf_mode VSC_SF_EXCLUDE[1] = {{"exclude", 0, 0}};
+static struct vsc_sf_mode VSC_SF_INCLUDE[1] = {{"include", 1, 1, 1}};
+static struct vsc_sf_mode VSC_SF_EXCLUDE[1] = {{"exclude", 0, 0, 1}};
+static struct vsc_sf_mode VSC_SF_REQUIRE[1] = {{"require", 1, 0, 0}};
struct vsc_sf {
unsigned magic;
@@ -150,7 +152,10 @@ vsc_sf_arg(struct vsc *vsc, const char *glob, const struct vsc_sf_mode *mode)
AN(sf);
REPLACE(sf->pattern, glob);
sf->mode = mode;
- VTAILQ_INSERT_TAIL(&vsc->sf_list, sf, list);
+ if (mode->append)
+ VTAILQ_INSERT_TAIL(&vsc->sf_list, sf, list);
+ else
+ VTAILQ_INSERT_HEAD(&vsc->sf_list, sf, list);
return (1);
}
@@ -177,6 +182,7 @@ VSC_Arg(struct vsc *vsc, char arg, const char *opt)
switch (arg) {
case 'I': return (vsc_sf_arg(vsc, opt, VSC_SF_INCLUDE));
case 'X': return (vsc_sf_arg(vsc, opt, VSC_SF_EXCLUDE));
+ case 'R': return (vsc_sf_arg(vsc, opt, VSC_SF_REQUIRE));
case 'f': return (vsc_f_arg(vsc, opt));
default: return (0);
}
More information about the varnish-commit
mailing list