From 17a95db11d8514ae9c9aad3ab53fe4eff4030b5c Mon Sep 17 00:00:00 2001 From: phk Date: Mon, 20 Oct 2008 15:01:37 +0000 Subject: [PATCH] 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: svn+ssh://projects.linpro.no/svn/varnish/trunk@3329 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_ban.c | 41 +++++++++++++++++++++++--- varnish-cache/bin/varnishd/heritage.h | 3 ++ varnish-cache/bin/varnishd/mgt_param.c | 4 +++ varnish-cache/include/stat_field.h | 1 + 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_ban.c b/varnish-cache/bin/varnishd/cache_ban.c index 77ca6324..ae5c4cf0 100644 --- a/varnish-cache/bin/varnishd/cache_ban.c +++ b/varnish-cache/bin/varnishd/cache_ban.c @@ -49,6 +49,8 @@ struct ban { #define BAN_MAGIC 0x700b08ea VTAILQ_ENTRY(ban) list; unsigned refcount; + int flags; +#define BAN_F_GONE (1 << 0) regex_t regexp; char *ban; int hash; @@ -68,8 +70,9 @@ static struct ban * volatile ban_start; int BAN_Add(struct cli *cli, const char *regexp, int hash) { - struct ban *b; + struct ban *b, *bi, *be; char buf[512]; + unsigned pcount; int i; ALLOC_OBJ(b, BAN_MAGIC); @@ -97,6 +100,35 @@ BAN_Add(struct cli *cli, const char *regexp, int hash) ban_start = b; VSL_stats->n_purge++; 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); return (0); @@ -168,7 +200,8 @@ BAN_CheckObject(struct object *o, const char *url, const char *hash) tests = 0; for (b = b0; b != o->ban; b = VTAILQ_NEXT(b, list)) { 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; } @@ -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)) { if (b0->refcount == 0 && VTAILQ_NEXT(b0, list) == NULL) break; - cli_out(cli, "%5u %s \"%s\"\n", - b0->refcount, + cli_out(cli, "%5u %d %s \"%s\"\n", + b0->refcount, b0->flags, b0->hash ? "hash" : "url ", b0->ban); } diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index 14d482e3..fd7dada8 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -183,6 +183,9 @@ struct params { /* Amount of time to sleep when running out of file descriptors. In msecs */ unsigned accept_fd_holdoff; + + /* Get rid of duplicate purges */ + unsigned purge_dups; }; extern volatile struct params *params; diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index 02bee682..ae5e0672 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -825,6 +825,10 @@ static const struct parspec parspec[] = { "The TTL assigned to the synthesized error pages\n", 0, "0", "seconds" }, + { "purge_dups", tweak_bool, &master.purge_dups, 0, 0, + "Detect and eliminate duplicate purges.\n", + 0, + "off", "bool" }, { NULL, NULL, NULL } }; diff --git a/varnish-cache/include/stat_field.h b/varnish-cache/include/stat_field.h index b0f496b1..127e30b9 100644 --- a/varnish-cache/include/stat_field.h +++ b/varnish-cache/include/stat_field.h @@ -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_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_dups, uint64_t, 'a', "N duplicate purges removed") -- 2.39.5