[master] b78cb58ab vsc: Fold the include and exclude lists together
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Mon Aug 31 16:00:08 UTC 2020
commit b78cb58ab820e30696f5591279e9081a5b3e8cf1
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Tue Aug 25 17:07:44 2020 +0200
vsc: Fold the include and exclude lists together
Instead we now have a single list that works on a first-match basis,
slightly changing the previous outcome where all exclusions were
checked before inclusions as illustrated by the u5 VTC.
To add insult to the injury the precedence of exclusive patterns over
inclusive patterns was documented backwards.
diff --git a/bin/varnishtest/tests/u00005.vtc b/bin/varnishtest/tests/u00005.vtc
index 415307c45..bc6c79207 100644
--- a/bin/varnishtest/tests/u00005.vtc
+++ b/bin/varnishtest/tests/u00005.vtc
@@ -19,8 +19,8 @@ shell "grep -q vbe ${p1_out}"
shell "grep -q LCK.mempool.creat ${p1_out}"
shell -err "grep -q LCK.vbe.destroy ${p1_out}"
-process p2 {varnishstat -1 -n ${v1_name} -f *vbe* \
- -f ^*vbe.destroy -f LCK.mempool.c* | tr '[1-9]' '0'} -run
+process p2 {varnishstat -1 -n ${v1_name} -f ^*vbe.destroy -f *vbe* \
+ -f LCK.mempool.c* | tr '[1-9]' '0'} -run
shell "cmp -s ${p1_out} ${p2_out}"
diff --git a/include/vapi/vapi_options.h b/include/vapi/vapi_options.h
index 823c3b673..8febf761b 100644
--- a/include/vapi/vapi_options.h
+++ b/include/vapi/vapi_options.h
@@ -132,6 +132,6 @@
"Field inclusion glob." \
" Use backslash to escape characters. If the argument" \
" starts with '^' it is used as an exclusive glob." \
- " Multiple -f arguments may be given. Inclusive globs" \
- " are accumulative and are run before exclusive ones." \
+ " Multiple -f arguments may be given. Filtering globs" \
+ " are run in order on a first-match basis." \
)
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 6846e19f3..d0ee9afb2 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -53,12 +53,23 @@
#include "vapi/vsc.h"
#include "vapi/vsm.h"
+struct vsc_sf_mode {
+ const char *name;
+ unsigned include;
+ unsigned fail;
+};
+
+static struct vsc_sf_mode VSC_SF_INCLUDE[1] = {{"include", 1, 1}};
+static struct vsc_sf_mode VSC_SF_EXCLUDE[1] = {{"exclude", 0, 0}};
+
struct vsc_sf {
- unsigned magic;
-#define VSC_SF_MAGIC 0x558478dd
- VTAILQ_ENTRY(vsc_sf) list;
- char *pattern;
+ unsigned magic;
+#define VSC_SF_MAGIC 0x558478dd
+ VTAILQ_ENTRY(vsc_sf) list;
+ char *pattern;
+ const struct vsc_sf_mode *mode;
};
+
VTAILQ_HEAD(vsc_sf_head, vsc_sf);
struct vsc_pt {
@@ -85,8 +96,7 @@ struct vsc {
unsigned magic;
#define VSC_MAGIC 0x3373554a
- struct vsc_sf_head sf_list_include;
- struct vsc_sf_head sf_list_exclude;
+ struct vsc_sf_head sf_list;
VTAILQ_HEAD(,vsc_seg) segs;
VSC_new_f *fnew;
@@ -120,8 +130,7 @@ VSC_New(void)
ALLOC_OBJ(vsc, VSC_MAGIC);
if (vsc == NULL)
return (vsc);
- VTAILQ_INIT(&vsc->sf_list_include);
- VTAILQ_INIT(&vsc->sf_list_exclude);
+ VTAILQ_INIT(&vsc->sf_list);
VTAILQ_INIT(&vsc->segs);
return (vsc);
}
@@ -132,7 +141,6 @@ static int
vsc_f_arg(struct vsc *vsc, const char *opt)
{
struct vsc_sf *sf;
- unsigned exclude = 0;
AN(opt);
@@ -140,18 +148,14 @@ vsc_f_arg(struct vsc *vsc, const char *opt)
AN(sf);
if (opt[0] == '^') {
- exclude = 1;
+ sf->mode = VSC_SF_EXCLUDE;
opt++;
+ } else {
+ sf->mode = VSC_SF_INCLUDE;
}
- sf->pattern = strdup(opt);
- AN(sf->pattern);
-
- if (exclude)
- VTAILQ_INSERT_TAIL(&vsc->sf_list_exclude, sf, list);
- else
- VTAILQ_INSERT_TAIL(&vsc->sf_list_include, sf, list);
-
+ REPLACE(sf->pattern, opt);
+ VTAILQ_INSERT_TAIL(&vsc->sf_list, sf, list);
return (1);
}
@@ -177,17 +181,15 @@ static int
vsc_filter(const struct vsc *vsc, const char *nm)
{
struct vsc_sf *sf;
+ unsigned res = 0;
CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
- VTAILQ_FOREACH(sf, &vsc->sf_list_exclude, list)
+ VTAILQ_FOREACH(sf, &vsc->sf_list, list) {
if (!fnmatch(sf->pattern, nm, 0))
- return (1);
- if (VTAILQ_EMPTY(&vsc->sf_list_include))
- return (0);
- VTAILQ_FOREACH(sf, &vsc->sf_list_include, list)
- if (!fnmatch(sf->pattern, nm, 0))
- return (0);
- return (1);
+ return (!sf->mode->include);
+ res |= sf->mode->fail;
+ }
+ return (res);
}
/*--------------------------------------------------------------------
@@ -516,29 +518,21 @@ VSC_ChangeLevel(const struct VSC_level_desc *old, int chg)
/*--------------------------------------------------------------------*/
-static void
-vsc_delete_sf_list(struct vsc_sf_head *head)
-{
- struct vsc_sf *sf;
-
- while (!VTAILQ_EMPTY(head)) {
- sf = VTAILQ_FIRST(head);
- CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
- VTAILQ_REMOVE(head, sf, list);
- free(sf->pattern);
- FREE_OBJ(sf);
- }
-}
-
void
VSC_Destroy(struct vsc **vscp, struct vsm *vsm)
{
struct vsc *vsc;
+ struct vsc_sf *sf, *sf2;
struct vsc_seg *sp, *sp2;
TAKE_OBJ_NOTNULL(vsc, vscp, VSC_MAGIC);
- vsc_delete_sf_list(&vsc->sf_list_include);
- vsc_delete_sf_list(&vsc->sf_list_exclude);
+
+ VTAILQ_FOREACH_SAFE(sf, &vsc->sf_list, list, sf2) {
+ CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
+ VTAILQ_REMOVE(&vsc->sf_list, sf, list);
+ free(sf->pattern);
+ FREE_OBJ(sf);
+ }
VTAILQ_FOREACH_SAFE(sp, &vsc->segs, list, sp2) {
VTAILQ_REMOVE(&vsc->segs, sp, list);
vsc_expose(vsc, sp, 1);
More information about the varnish-commit
mailing list