[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