Commit e38aee4b authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Add a boolean parameter "purge_dups", to make it possible to mark earlier

bans of the same regexp as "gone" to save duplicate regexp checking.

Prodded to by:	jodok



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3329 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent ed8e0257
...@@ -49,6 +49,8 @@ struct ban { ...@@ -49,6 +49,8 @@ struct ban {
#define BAN_MAGIC 0x700b08ea #define BAN_MAGIC 0x700b08ea
VTAILQ_ENTRY(ban) list; VTAILQ_ENTRY(ban) list;
unsigned refcount; unsigned refcount;
int flags;
#define BAN_F_GONE (1 << 0)
regex_t regexp; regex_t regexp;
char *ban; char *ban;
int hash; int hash;
...@@ -68,8 +70,9 @@ static struct ban * volatile ban_start; ...@@ -68,8 +70,9 @@ static struct ban * volatile ban_start;
int int
BAN_Add(struct cli *cli, const char *regexp, int hash) BAN_Add(struct cli *cli, const char *regexp, int hash)
{ {
struct ban *b; struct ban *b, *bi, *be;
char buf[512]; char buf[512];
unsigned pcount;
int i; int i;
ALLOC_OBJ(b, BAN_MAGIC); ALLOC_OBJ(b, BAN_MAGIC);
...@@ -97,6 +100,35 @@ BAN_Add(struct cli *cli, const char *regexp, int hash) ...@@ -97,6 +100,35 @@ BAN_Add(struct cli *cli, const char *regexp, int hash)
ban_start = b; ban_start = b;
VSL_stats->n_purge++; VSL_stats->n_purge++;
VSL_stats->n_purge_add++; VSL_stats->n_purge_add++;
if (params->purge_dups) {
be = VTAILQ_LAST(&ban_head, banhead);
be->refcount++;
} else
be = NULL;
UNLOCK(&ban_mtx);
if (be == NULL)
return (0);
/* Hunt down duplicates, and mark them as gone */
bi = b;
pcount = 0;
while(bi != be) {
bi = VTAILQ_NEXT(bi, list);
if (bi->flags & BAN_F_GONE)
continue;
if (b->hash != bi->hash)
continue;
if (strcmp(b->ban, bi->ban))
continue;
bi->flags |= BAN_F_GONE;
pcount++;
}
LOCK(&ban_mtx);
be->refcount--;
/* XXX: We should check if the tail can be removed */
VSL_stats->n_purge_dups += pcount;
UNLOCK(&ban_mtx); UNLOCK(&ban_mtx);
return (0); return (0);
...@@ -168,7 +200,8 @@ BAN_CheckObject(struct object *o, const char *url, const char *hash) ...@@ -168,7 +200,8 @@ BAN_CheckObject(struct object *o, const char *url, const char *hash)
tests = 0; tests = 0;
for (b = b0; b != o->ban; b = VTAILQ_NEXT(b, list)) { for (b = b0; b != o->ban; b = VTAILQ_NEXT(b, list)) {
tests++; tests++;
if (!regexec(&b->regexp, b->hash ? hash : url, 0, NULL, 0)) if (!(b->flags & BAN_F_GONE) &&
!regexec(&b->regexp, b->hash ? hash : url, 0, NULL, 0))
break; break;
} }
...@@ -227,8 +260,8 @@ ccf_purge_list(struct cli *cli, const char * const *av, void *priv) ...@@ -227,8 +260,8 @@ ccf_purge_list(struct cli *cli, const char * const *av, void *priv)
for (b0 = ban_start; b0 != NULL; b0 = VTAILQ_NEXT(b0, list)) { for (b0 = ban_start; b0 != NULL; b0 = VTAILQ_NEXT(b0, list)) {
if (b0->refcount == 0 && VTAILQ_NEXT(b0, list) == NULL) if (b0->refcount == 0 && VTAILQ_NEXT(b0, list) == NULL)
break; break;
cli_out(cli, "%5u %s \"%s\"\n", cli_out(cli, "%5u %d %s \"%s\"\n",
b0->refcount, b0->refcount, b0->flags,
b0->hash ? "hash" : "url ", b0->hash ? "hash" : "url ",
b0->ban); b0->ban);
} }
......
...@@ -183,6 +183,9 @@ struct params { ...@@ -183,6 +183,9 @@ struct params {
/* Amount of time to sleep when running out of file /* Amount of time to sleep when running out of file
descriptors. In msecs */ descriptors. In msecs */
unsigned accept_fd_holdoff; unsigned accept_fd_holdoff;
/* Get rid of duplicate purges */
unsigned purge_dups;
}; };
extern volatile struct params *params; extern volatile struct params *params;
......
...@@ -825,6 +825,10 @@ static const struct parspec parspec[] = { ...@@ -825,6 +825,10 @@ static const struct parspec parspec[] = {
"The TTL assigned to the synthesized error pages\n", "The TTL assigned to the synthesized error pages\n",
0, 0,
"0", "seconds" }, "0", "seconds" },
{ "purge_dups", tweak_bool, &master.purge_dups, 0, 0,
"Detect and eliminate duplicate purges.\n",
0,
"off", "bool" },
{ NULL, NULL, NULL } { NULL, NULL, NULL }
}; };
......
...@@ -125,3 +125,4 @@ MAC_STAT(n_purge_add, uint64_t, 'a', "N new purges added") ...@@ -125,3 +125,4 @@ MAC_STAT(n_purge_add, uint64_t, 'a', "N new purges added")
MAC_STAT(n_purge_retire, uint64_t, 'a', "N old purges deleted") MAC_STAT(n_purge_retire, uint64_t, 'a', "N old purges deleted")
MAC_STAT(n_purge_obj_test, uint64_t, 'a', "N objects tested") MAC_STAT(n_purge_obj_test, uint64_t, 'a', "N objects tested")
MAC_STAT(n_purge_re_test, uint64_t, 'a', "N regexps tested against") MAC_STAT(n_purge_re_test, uint64_t, 'a', "N regexps tested against")
MAC_STAT(n_purge_dups, uint64_t, 'a', "N duplicate purges removed")
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