Commit f59a67ac authored by Tollef Fog Heen's avatar Tollef Fog Heen

Merge r3520+r3521: Set cost 10 on regexp tests.

Let purge.list prune the tail of the list before dumping.

Add a protective object to prevent purge.list from pruning our
purges before we test their numbers.



git-svn-id: http://www.varnish-cache.org/svn/branches/2.0@3709 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 4f818725
...@@ -154,6 +154,8 @@ ban_free_ban(struct ban *b) ...@@ -154,6 +154,8 @@ ban_free_ban(struct ban *b)
regfree(&bt->re); regfree(&bt->re);
if (bt->dst != NULL) if (bt->dst != NULL)
free(bt->dst); free(bt->dst);
if (bt->src != NULL)
free(bt->src);
FREE_OBJ(bt); FREE_OBJ(bt);
} }
FREE_OBJ(b); FREE_OBJ(b);
...@@ -276,6 +278,7 @@ ban_parse_regexp(struct cli *cli, struct ban_test *bt, const char *a3) ...@@ -276,6 +278,7 @@ ban_parse_regexp(struct cli *cli, struct ban_test *bt, const char *a3)
return (-1); return (-1);
} }
bt->flags |= BAN_T_REGEXP; bt->flags |= BAN_T_REGEXP;
bt->cost = 10;
return (0); return (0);
} }
...@@ -429,6 +432,23 @@ BAN_NewObj(struct object *o) ...@@ -429,6 +432,23 @@ BAN_NewObj(struct object *o)
Lck_Unlock(&ban_mtx); Lck_Unlock(&ban_mtx);
} }
static struct ban *
BAN_CheckLast(void)
{
struct ban *b;
Lck_AssertHeld(&ban_mtx);
b = VTAILQ_LAST(&ban_head, banhead);
if (b != VTAILQ_FIRST(&ban_head) && b->refcount == 0) {
VSL_stats->n_purge--;
VSL_stats->n_purge_retire++;
VTAILQ_REMOVE(&ban_head, b, list);
} else {
b = NULL;
}
return (b);
}
void void
BAN_DestroyObj(struct object *o) BAN_DestroyObj(struct object *o)
{ {
...@@ -442,21 +462,15 @@ BAN_DestroyObj(struct object *o) ...@@ -442,21 +462,15 @@ BAN_DestroyObj(struct object *o)
o->ban->refcount--; o->ban->refcount--;
o->ban = NULL; o->ban = NULL;
/* Check if we can purge the last ban entry */ /* Attempt to purge last ban entry */
b = VTAILQ_LAST(&ban_head, banhead); b = BAN_CheckLast();
if (b != VTAILQ_FIRST(&ban_head) && b->refcount == 0) {
VSL_stats->n_purge--;
VSL_stats->n_purge_retire++;
VTAILQ_REMOVE(&ban_head, b, list);
} else {
b = NULL;
}
Lck_Unlock(&ban_mtx); Lck_Unlock(&ban_mtx);
if (b != NULL) if (b != NULL)
ban_free_ban(b); ban_free_ban(b);
} }
int int
BAN_CheckObject(struct object *o, const struct sess *sp) BAN_CheckObject(struct object *o, const struct sess *sp)
{ {
...@@ -608,9 +622,16 @@ ccf_purge_list(struct cli *cli, const char * const *av, void *priv) ...@@ -608,9 +622,16 @@ ccf_purge_list(struct cli *cli, const char * const *av, void *priv)
(void)av; (void)av;
(void)priv; (void)priv;
do {
/* Attempt to purge last ban entry */
Lck_Lock(&ban_mtx); Lck_Lock(&ban_mtx);
b = BAN_CheckLast();
if (b == NULL)
VTAILQ_LAST(&ban_head, banhead)->refcount++; VTAILQ_LAST(&ban_head, banhead)->refcount++;
Lck_Unlock(&ban_mtx); Lck_Unlock(&ban_mtx);
if (b != NULL)
ban_free_ban(b);
} while (b != NULL);
VTAILQ_FOREACH(b, &ban_head, list) { VTAILQ_FOREACH(b, &ban_head, list) {
if (b->flags & BAN_F_GONE) if (b->flags & BAN_F_GONE)
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
test "Check purge counters and duplicate purge elimination" test "Check purge counters and duplicate purge elimination"
server s1 { server s1 {
rxreq
txresp -hdr "foo: 0" -body "foo0"
rxreq rxreq
txresp -hdr "foo: 1" -body "foo1" txresp -hdr "foo: 1" -body "foo1"
rxreq rxreq
...@@ -22,6 +24,9 @@ varnish v1 -cliok "purge.list" ...@@ -22,6 +24,9 @@ varnish v1 -cliok "purge.list"
# Our fetch is not affected by the purge # Our fetch is not affected by the purge
# as the FOO-purge was preexisting # as the FOO-purge was preexisting
client c1 { client c1 {
txreq -url /BAR
rxresp
expect resp.http.foo == 0
txreq -url /FOO txreq -url /FOO
rxresp rxresp
expect resp.http.foo == 1 expect resp.http.foo == 1
...@@ -64,7 +69,7 @@ varnish v1 -expect n_purge_add == 5 ...@@ -64,7 +69,7 @@ varnish v1 -expect n_purge_add == 5
# Enable dup removal of purges # Enable dup removal of purges
varnish v1 -cliok "param.set purge_dups on" varnish v1 -cliok "param.set purge_dups on"
# This should incapacitate the to previous FOO purges. # This should incapacitate the two previous FOO purges.
varnish v1 -cliok "purge.url FOO" varnish v1 -cliok "purge.url FOO"
varnish v1 -expect n_purge_add == 6 varnish v1 -expect n_purge_add == 6
varnish v1 -expect n_purge_dups == 3 varnish v1 -expect n_purge_dups == 3
......
...@@ -112,7 +112,7 @@ client c1 { ...@@ -112,7 +112,7 @@ client c1 {
} -run } -run
# header check, no header # header check, no header
varnish v1 -cliok "purge obj.http.bar == barcheck" varnish v1 -cliok "purge req.url ~ foo && obj.http.bar == barcheck"
varnish v1 -cliok "purge.list" varnish v1 -cliok "purge.list"
client c1 { client c1 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment