[master] a6d082e Count reloaded bans in VSC::bans_req
Poul-Henning Kamp
phk at varnish-cache.org
Mon Nov 12 09:48:40 CET 2012
commit a6d082e96efc047da0ce33dd663e506347fe321f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Nov 12 08:46:40 2012 +0000
Count reloaded bans in VSC::bans_req
Replace some magic numbers by #defines and segregate the ban-string
Base patch from: martin
Fixes #1225
diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index aa8bca9..5f9c68a 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -44,10 +44,10 @@
* 1 byte - flags: 0x01: BAN_F_REQ
* N tests
* A test have this form:
- * 1 byte - arg (see ban_vars.h col 3 "BAN_ARG_XXX")
+ * 1 byte - arg (see ban_vars.h col 3 "BANS_ARG_XXX")
* (n bytes) - http header name, canonical encoding
* lump - comparison arg
- * 1 byte - operation (BAN_OPER_)
+ * 1 byte - operation (BANS_OPER_)
* (lump) - compiled regexp
* A lump is:
* 4 bytes - be32: length
@@ -106,18 +106,21 @@ static struct ban * volatile ban_start;
static bgthread_t ban_lurker;
/*--------------------------------------------------------------------
- * BAN string magic markers
+ * BAN string defines & magic markers
*/
-#define BAN_OPER_EQ 0x10
-#define BAN_OPER_NEQ 0x11
-#define BAN_OPER_MATCH 0x12
-#define BAN_OPER_NMATCH 0x13
+#define BANS_FLAGS 12
+#define BANS_FLAG_REQ 0x01
-#define BAN_ARG_URL 0x18
-#define BAN_ARG_REQHTTP 0x19
-#define BAN_ARG_OBJHTTP 0x1a
-#define BAN_ARG_OBJSTATUS 0x1b
+#define BANS_OPER_EQ 0x10
+#define BANS_OPER_NEQ 0x11
+#define BANS_OPER_MATCH 0x12
+#define BANS_OPER_NMATCH 0x13
+
+#define BANS_ARG_URL 0x18
+#define BANS_ARG_REQHTTP 0x19
+#define BANS_ARG_OBJHTTP 0x1a
+#define BANS_ARG_OBJSTATUS 0x1b
/*--------------------------------------------------------------------
* Variables we can purge on
@@ -261,13 +264,13 @@ ban_iter(const uint8_t **bs, struct ban_test *bt)
memset(bt, 0, sizeof *bt);
bt->arg1 = *(*bs)++;
- if (bt->arg1 == BAN_ARG_REQHTTP || bt->arg1 == BAN_ARG_OBJHTTP) {
+ if (bt->arg1 == BANS_ARG_REQHTTP || bt->arg1 == BANS_ARG_OBJHTTP) {
bt->arg1_spec = (const char *)*bs;
(*bs) += (*bs)[0] + 2;
}
bt->arg2 = ban_get_lump(bs);
bt->oper = *(*bs)++;
- if (bt->oper == BAN_OPER_MATCH || bt->oper == BAN_OPER_NMATCH)
+ if (bt->oper == BANS_OPER_MATCH || bt->oper == BANS_OPER_NMATCH)
bt->arg2_spec = ban_get_lump(bs);
}
@@ -345,19 +348,19 @@ BAN_AddTest(struct cli *cli, struct ban *b, const char *a1, const char *a2,
ban_add_lump(b, a3, strlen(a3) + 1);
if (!strcmp(a2, "~")) {
- VSB_putc(b->vsb, BAN_OPER_MATCH);
+ VSB_putc(b->vsb, BANS_OPER_MATCH);
i = ban_parse_regexp(cli, b, a3);
if (i)
return (i);
} else if (!strcmp(a2, "!~")) {
- VSB_putc(b->vsb, BAN_OPER_NMATCH);
+ VSB_putc(b->vsb, BANS_OPER_NMATCH);
i = ban_parse_regexp(cli, b, a3);
if (i)
return (i);
} else if (!strcmp(a2, "==")) {
- VSB_putc(b->vsb, BAN_OPER_EQ);
+ VSB_putc(b->vsb, BANS_OPER_EQ);
} else if (!strcmp(a2, "!=")) {
- VSB_putc(b->vsb, BAN_OPER_NEQ);
+ VSB_putc(b->vsb, BANS_OPER_NEQ);
} else {
VCLI_Out(cli,
"expected conditional (~, !~, == or !=) got \"%s\"", a2);
@@ -392,7 +395,7 @@ BAN_Insert(struct ban *b)
t0 = VTIM_real();
memcpy(b->spec, &t0, sizeof t0);
- b->spec[12] = (b->flags & BAN_F_REQ) ? 1 : 0;
+ b->spec[BANS_FLAGS] = (b->flags & BAN_F_REQ) ? BANS_FLAG_REQ : 0;
memcpy(b->spec + 13, VSB_data(b->vsb), ln);
ln += 13;
vbe32enc(b->spec + 8, ln);
@@ -551,8 +554,10 @@ BAN_Reload(const uint8_t *ban, unsigned len)
AN(b2->spec);
memcpy(b2->spec, ban, len);
b2->flags |= gone;
- if (ban[12])
+ if (ban[BANS_FLAGS] & BANS_FLAG_REQ) {
+ VSC_C_main->bans_req++;
b2->flags |= BAN_F_REQ;
+ }
if (b == NULL)
VTAILQ_INSERT_TAIL(&ban_head, b2, list);
else
@@ -623,18 +628,18 @@ ban_evaluate(const uint8_t *bs, const struct http *objhttp,
ban_iter(&bs, &bt);
arg1 = NULL;
switch (bt.arg1) {
- case BAN_ARG_URL:
+ case BANS_ARG_URL:
AN(reqhttp);
arg1 = reqhttp->hd[HTTP_HDR_URL].b;
break;
- case BAN_ARG_REQHTTP:
+ case BANS_ARG_REQHTTP:
AN(reqhttp);
(void)http_GetHdr(reqhttp, bt.arg1_spec, &arg1);
break;
- case BAN_ARG_OBJHTTP:
+ case BANS_ARG_OBJHTTP:
(void)http_GetHdr(objhttp, bt.arg1_spec, &arg1);
break;
- case BAN_ARG_OBJSTATUS:
+ case BANS_ARG_OBJSTATUS:
arg1 = buf;
sprintf(buf, "%d", objhttp->status);
break;
@@ -643,21 +648,21 @@ ban_evaluate(const uint8_t *bs, const struct http *objhttp,
}
switch (bt.oper) {
- case BAN_OPER_EQ:
+ case BANS_OPER_EQ:
if (arg1 == NULL || strcmp(arg1, bt.arg2))
return (0);
break;
- case BAN_OPER_NEQ:
+ case BANS_OPER_NEQ:
if (arg1 != NULL && !strcmp(arg1, bt.arg2))
return (0);
break;
- case BAN_OPER_MATCH:
+ case BANS_OPER_MATCH:
if (arg1 == NULL ||
pcre_exec(bt.arg2_spec, NULL, arg1, strlen(arg1),
0, 0, NULL, 0) < 0)
return (0);
break;
- case BAN_OPER_NMATCH:
+ case BANS_OPER_NMATCH:
if (arg1 != NULL &&
pcre_exec(bt.arg2_spec, NULL, arg1, strlen(arg1),
0, 0, NULL, 0) >= 0)
@@ -1060,14 +1065,14 @@ ban_render(struct cli *cli, const uint8_t *bs)
while (bs < be) {
ban_iter(&bs, &bt);
switch (bt.arg1) {
- case BAN_ARG_URL:
+ case BANS_ARG_URL:
VCLI_Out(cli, "req.url");
break;
- case BAN_ARG_REQHTTP:
+ case BANS_ARG_REQHTTP:
VCLI_Out(cli, "req.http.%.*s",
bt.arg1_spec[0] - 1, bt.arg1_spec + 1);
break;
- case BAN_ARG_OBJHTTP:
+ case BANS_ARG_OBJHTTP:
VCLI_Out(cli, "obj.http.%.*s",
bt.arg1_spec[0] - 1, bt.arg1_spec + 1);
break;
@@ -1075,10 +1080,10 @@ ban_render(struct cli *cli, const uint8_t *bs)
INCOMPL();
}
switch (bt.oper) {
- case BAN_OPER_EQ: VCLI_Out(cli, " == "); break;
- case BAN_OPER_NEQ: VCLI_Out(cli, " != "); break;
- case BAN_OPER_MATCH: VCLI_Out(cli, " ~ "); break;
- case BAN_OPER_NMATCH: VCLI_Out(cli, " !~ "); break;
+ case BANS_OPER_EQ: VCLI_Out(cli, " == "); break;
+ case BANS_OPER_NEQ: VCLI_Out(cli, " != "); break;
+ case BANS_OPER_MATCH: VCLI_Out(cli, " ~ "); break;
+ case BANS_OPER_NMATCH: VCLI_Out(cli, " !~ "); break;
default:
INCOMPL();
}
diff --git a/bin/varnishtest/tests/r01225.vtc b/bin/varnishtest/tests/r01225.vtc
new file mode 100644
index 0000000..5ae42b3
--- /dev/null
+++ b/bin/varnishtest/tests/r01225.vtc
@@ -0,0 +1,62 @@
+varnishtest "Test bans_req counter on persistent reload - #1225"
+
+shell "rm -f ${tmpdir}/_.per"
+
+server s1 {
+ rxreq
+ expect req.url == "/"
+ txresp -hdr "Foo: foo"
+} -start
+
+varnish v1 \
+ -arg "-pfeature=+wait_silo" \
+ -storage "-spersistent,${tmpdir}/_.per,10m" \
+ -arg "-pban_lurker_sleep=0.01" \
+ -vcl+backend { } -start
+
+varnish v1 -cliok ban.list
+
+client c1 {
+ txreq -url "/"
+ rxresp
+ expect resp.status == 200
+ expect resp.http.foo == "foo"
+} -run
+
+# Count of 1 here (magic ban only)
+varnish v1 -expect bans == 1
+varnish v1 -cliok "ban req.url == /"
+varnish v1 -cliok ban.list
+
+# Count of 2 here (our + magic ban)
+varnish v1 -expect bans == 2
+varnish v1 -expect bans_req == 1
+varnish v1 -stop
+server s1 -wait
+
+server s1 {
+ rxreq
+ expect req.url == "/"
+ txresp -hdr "Foo: bar"
+} -start
+
+varnish v1 -start
+
+varnish v1 -cliok ban.list
+
+# Count of >2 here, ours plus magic bans from 2 startups
+varnish v1 -expect bans >= 2
+
+client c1 {
+ txreq -url "/"
+ rxresp
+ expect resp.status == 200
+ expect resp.http.foo == "bar"
+} -run
+
+varnish v1 -cliok ban.list
+# Count of 1 here
+varnish v1 -expect bans == 1
+varnish v1 -expect bans_req == 0
+
+varnish v1 -stop
diff --git a/include/tbl/ban_vars.h b/include/tbl/ban_vars.h
index 65b17e0..abf083e 100644
--- a/include/tbl/ban_vars.h
+++ b/include/tbl/ban_vars.h
@@ -32,7 +32,7 @@
#define PVAR_HTTP 1
#define PVAR_REQ 2
-PVAR("req.url", PVAR_REQ, BAN_ARG_URL)
-PVAR("req.http.", PVAR_REQ|PVAR_HTTP, BAN_ARG_REQHTTP)
-PVAR("obj.http.", PVAR_HTTP, BAN_ARG_OBJHTTP)
-PVAR("obj.status", 0, BAN_ARG_OBJSTATUS)
+PVAR("req.url", PVAR_REQ, BANS_ARG_URL)
+PVAR("req.http.", PVAR_REQ|PVAR_HTTP, BANS_ARG_REQHTTP)
+PVAR("obj.http.", PVAR_HTTP, BANS_ARG_OBJHTTP)
+PVAR("obj.status", 0, BANS_ARG_OBJSTATUS)
More information about the varnish-commit
mailing list