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)
regfree(&bt->re);
if (bt->dst != NULL)
free(bt->dst);
if (bt->src != NULL)
free(bt->src);
FREE_OBJ(bt);
}
FREE_OBJ(b);
......@@ -276,6 +278,7 @@ ban_parse_regexp(struct cli *cli, struct ban_test *bt, const char *a3)
return (-1);
}
bt->flags |= BAN_T_REGEXP;
bt->cost = 10;
return (0);
}
......@@ -429,6 +432,23 @@ BAN_NewObj(struct object *o)
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
BAN_DestroyObj(struct object *o)
{
......@@ -442,21 +462,15 @@ BAN_DestroyObj(struct object *o)
o->ban->refcount--;
o->ban = NULL;
/* Check if we can purge the last ban entry */
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;
}
/* Attempt to purge last ban entry */
b = BAN_CheckLast();
Lck_Unlock(&ban_mtx);
if (b != NULL)
ban_free_ban(b);
}
int
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)
(void)av;
(void)priv;
Lck_Lock(&ban_mtx);
VTAILQ_LAST(&ban_head, banhead)->refcount++;
Lck_Unlock(&ban_mtx);
do {
/* Attempt to purge last ban entry */
Lck_Lock(&ban_mtx);
b = BAN_CheckLast();
if (b == NULL)
VTAILQ_LAST(&ban_head, banhead)->refcount++;
Lck_Unlock(&ban_mtx);
if (b != NULL)
ban_free_ban(b);
} while (b != NULL);
VTAILQ_FOREACH(b, &ban_head, list) {
if (b->flags & BAN_F_GONE)
......
......@@ -3,6 +3,8 @@
test "Check purge counters and duplicate purge elimination"
server s1 {
rxreq
txresp -hdr "foo: 0" -body "foo0"
rxreq
txresp -hdr "foo: 1" -body "foo1"
rxreq
......@@ -22,6 +24,9 @@ varnish v1 -cliok "purge.list"
# Our fetch is not affected by the purge
# as the FOO-purge was preexisting
client c1 {
txreq -url /BAR
rxresp
expect resp.http.foo == 0
txreq -url /FOO
rxresp
expect resp.http.foo == 1
......@@ -64,7 +69,7 @@ varnish v1 -expect n_purge_add == 5
# Enable dup removal of purges
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 -expect n_purge_add == 6
varnish v1 -expect n_purge_dups == 3
......
......@@ -112,7 +112,7 @@ client c1 {
} -run
# 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"
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