[master] e7170a0 Rewrite the ban-lurker in light of many changes and evidence that it basically didn't work as intended any more.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Dec 12 14:17:00 CET 2013
commit e7170a0a8abf07a4251c8849b7aae53d227b4803
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Dec 12 13:16:16 2013 +0000
Rewrite the ban-lurker in light of many changes and evidence that
it basically didn't work as intended any more.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 1cf8018..38ca5e3 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -437,7 +437,6 @@ struct objcore {
#define OC_F_PASS (1<<2)
#define OC_F_OFFLRU (1<<4)
#define OC_F_PRIV (1<<5) /* Stevedore private flag */
-#define OC_F_LURK (3<<6) /* Ban-lurker-color */
#define OC_F_DYING (1<<7)
#define OC_F_PRIVATE (1<<8)
#define OC_F_FAILED (1<<9)
diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index ec309af..1edad6e 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -108,10 +108,10 @@ struct ban {
unsigned magic;
#define BAN_MAGIC 0x700b08ea
VTAILQ_ENTRY(ban) list;
+ VTAILQ_ENTRY(ban) l_list;
int refcount;
unsigned flags; /* BANS_FLAG_* */
-#define BAN_F_LURK (3 << 6) /* ban-lurker-color */
VTAILQ_HEAD(,objcore) objcore;
struct vsb *vsb;
uint8_t *spec;
@@ -119,8 +119,6 @@ struct ban {
VTAILQ_HEAD(banhead_s,ban);
-#define LURK_SHIFT 6
-
struct ban_test {
uint8_t arg1;
const char *arg1_spec;
@@ -135,6 +133,7 @@ static struct lock ban_mtx;
static struct ban *ban_magic;
static pthread_t ban_thread;
static struct ban * volatile ban_start;
+static struct objcore oc_marker = { .magic = OBJCORE_MAGIC, };
static bgthread_t ban_lurker;
static int ban_shutdown = 0;
@@ -274,6 +273,8 @@ ban_mark_gone(struct ban *b)
unsigned ln;
CHECK_OBJ_NOTNULL(b, BAN_MAGIC);
+ Lck_AssertHeld(&ban_mtx);
+
AN(b->spec);
AZ(b->flags & BANS_FLAG_GONE);
ln = ban_len(b->spec);
@@ -528,6 +529,8 @@ BAN_Insert(struct ban *b)
ban_start = b;
VSC_C_main->bans++;
VSC_C_main->bans_added++;
+ if (b->flags & BANS_FLAG_OBJ)
+ VSC_C_main->bans_obj++;
if (b->flags & BANS_FLAG_REQ)
VSC_C_main->bans_req++;
@@ -901,12 +904,21 @@ ban_check_object(struct object *o, struct vsl_log *vsl,
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(oc->ban, BAN_MAGIC);
+ /* First do an optimistic unlocked check */
b0 = ban_start;
CHECK_OBJ_NOTNULL(b0, BAN_MAGIC);
if (b0 == oc->ban)
return (0);
+ /* If that fails, make a safe check */
+ Lck_Lock(&ban_mtx);
+ b0 = ban_start;
+ Lck_Unlock(&ban_mtx);
+
+ if (b0 == oc->ban)
+ return (0);
+
/*
* This loop is safe without locks, because we know we hold
* a refcount on a ban somewhere in the list and we do not
@@ -918,12 +930,6 @@ ban_check_object(struct object *o, struct vsl_log *vsl,
CHECK_OBJ_NOTNULL(b, BAN_MAGIC);
if (b->flags & BANS_FLAG_GONE)
continue;
- if ((b->flags & BAN_F_LURK) &&
- (b->flags & BAN_F_LURK) == (oc->flags & OC_F_LURK)) {
- AZ(b->flags & BANS_FLAG_REQ);
- /* Lurker already tested this */
- continue;
- }
if (req_http == NULL && (b->flags & BANS_FLAG_REQ)) {
/*
* We cannot test this one, but there might
@@ -951,10 +957,10 @@ ban_check_object(struct object *o, struct vsl_log *vsl,
oc->ban->refcount--;
VTAILQ_REMOVE(&oc->ban->objcore, oc, ban_list);
if (b == oc->ban) { /* not banned */
- b->flags &= ~BAN_F_LURK;
VTAILQ_INSERT_TAIL(&b0->objcore, oc, ban_list);
b0->refcount++;
}
+
Lck_Unlock(&ban_mtx);
if (b == oc->ban) { /* not banned */
@@ -963,7 +969,8 @@ ban_check_object(struct object *o, struct vsl_log *vsl,
return (0);
} else {
oc->ban = NULL;
- VSLb(vsl, SLT_ExpBan, "%u was banned", o->vxid);
+ VSLb(vsl, SLT_ExpBan, "%u banned lookup", o->vxid);
+ VSC_C_main->bans_obj_killed++;
EXP_Rearm(o, o->exp.t_origin, 0, 0, 0); // XXX fake now
return (1);
}
@@ -987,6 +994,8 @@ ban_cleantail(void)
if (b != VTAILQ_FIRST(&ban_head) && b->refcount == 0) {
if (b->flags & BANS_FLAG_GONE)
VSC_C_main->bans_gone--;
+ if (b->flags & BANS_FLAG_OBJ)
+ VSC_C_main->bans_obj--;
if (b->flags & BANS_FLAG_REQ)
VSC_C_main->bans_req--;
VSC_C_main->bans--;
@@ -1005,147 +1014,155 @@ ban_cleantail(void)
}
/*--------------------------------------------------------------------
- * Ban lurker thread
+ * Our task here is somewhat tricky: The canonical locking order is
+ * objhead->mtx first, then ban_mtx, because that is the order which
+ * makes most sense in HSH_Lookup(), but we come the other way.
+ * We optimistically try to get them the other way, and get out of
+ * the way if that fails, and retry again later.
*/
-static int
-ban_lurker_work(struct worker *wrk, struct vsl_log *vsl)
+static struct objcore *
+ban_lurker_getfirst(struct vsl_log *vsl, struct ban *bt)
{
- struct ban *b, *b0;
struct objhead *oh;
- struct objcore *oc, *oc2;
+ struct objcore *oc;
+
+ while (1) {
+ Lck_Lock(&ban_mtx);
+ oc = VTAILQ_FIRST(&bt->objcore);
+ CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ if (oc == &oc_marker) {
+ VTAILQ_REMOVE(&bt->objcore, oc, ban_list);
+ Lck_Unlock(&ban_mtx);
+ return (NULL);
+ }
+ oh = oc->objhead;
+ CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
+ if (!Lck_Trylock(&oh->mtx) && oc->refcnt > 0) {
+ /*
+ * We got the lock, and the oc is not being
+ * dismantled under our feet, run with it...
+ */
+ oc->refcnt += 1;
+ VTAILQ_REMOVE(&bt->objcore, oc, ban_list);
+ VTAILQ_INSERT_TAIL(&bt->objcore, oc, ban_list);
+ Lck_Unlock(&oh->mtx);
+ Lck_Unlock(&ban_mtx);
+ break;
+ }
+
+ /* Try again, later */
+ Lck_Unlock(&ban_mtx);
+ VSC_C_main->bans_lurker_contention++;
+ VSL_Flush(vsl, 0);
+ VTIM_sleep(cache_param->ban_lurker_sleep);
+ }
+ return (oc);
+}
+
+static void
+ban_lurker_test_ban(struct worker *wrk, struct vsl_log *vsl, struct ban *bt,
+ const struct banhead_s *obans)
+{
+ struct ban *bl;
+ struct objcore *oc;
struct object *o;
- static unsigned pass = 1 << LURK_SHIFT;
+ unsigned tests;
int i;
- AN(pass & BAN_F_LURK);
- AZ(pass & ~BAN_F_LURK);
+ (void)wrk;
+ /*
+ * First see if there is anything to do, and if so, insert marker
+ */
+ Lck_Lock(&ban_mtx);
+ oc = VTAILQ_FIRST(&bt->objcore);
+ if (oc != NULL)
+ VTAILQ_INSERT_TAIL(&bt->objcore, &oc_marker, ban_list);
+ Lck_Unlock(&ban_mtx);
+ if (oc == NULL)
+ return;
+
+ while (1) {
+ oc = ban_lurker_getfirst(vsl, bt);
+ if (oc == NULL)
+ return;
+ o = oc_getobj(&wrk->stats, oc);
+ CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+ i = 0;
+ VTAILQ_FOREACH_REVERSE(bl, obans, banhead_s, l_list) {
+ tests = 0;
+ i = ban_evaluate(bl->spec, o->http, NULL, &tests);
+ VSC_C_main->bans_lurker_tested++;
+ VSC_C_main->bans_lurker_tests_tested += tests;
+ if (i)
+ break;
+ }
+ if (i) {
+ VSLb(vsl, SLT_ExpBan, "%u banned by lurker", o->vxid);
+ EXP_Rearm(o, o->exp.t_origin, 0, 0, 0); // XXX fake now
+ VSC_C_main->bans_lurker_obj_killed++;
+ }
+ (void)HSH_DerefObjCore(&wrk->stats, &oc);
+ }
+}
+
+/*--------------------------------------------------------------------
+ * Ban lurker thread
+ */
+
+static int
+ban_lurker_work(struct worker *wrk, struct vsl_log *vsl)
+{
+ struct ban *b, *bt;
+ //struct objhead *oh;
+ // struct objcore *oc, *oc2;
+ //struct object *o;
+ struct banhead_s obans;
+ int i;
/*
- * Find out if we have any bans we can do something about
- * If we find any, tag them with our pass number.
+ * Make a list of the bans we can do something about
*/
+
+ VTAILQ_INIT(&obans);
+ Lck_Lock(&ban_mtx);
+ b = ban_start;
+ Lck_Unlock(&ban_mtx);
i = 0;
- b0 = NULL;
- VTAILQ_FOREACH(b, &ban_head, list) {
- if (b->flags & BANS_FLAG_GONE)
- continue;
- if (b->flags & BANS_FLAG_REQ)
- continue;
- if (b == VTAILQ_LAST(&ban_head, banhead_s))
- continue;
- if (b0 == NULL)
- b0 = b;
- i++;
- b->flags &= ~BAN_F_LURK;
- b->flags |= pass;
+ while (b != NULL) {
+ if (b->flags & BANS_FLAG_GONE) {
+ ;
+ } else if (b->flags & BANS_FLAG_REQ) {
+ ;
+ } else if (b == VTAILQ_LAST(&ban_head, banhead_s)) {
+ ;
+ } else {
+ VTAILQ_INSERT_TAIL(&obans, b, l_list);
+ i++;
+ }
+ b = VTAILQ_NEXT(b, list);
}
if (DO_DEBUG(DBG_LURKER))
VSLb(vsl, SLT_Debug, "lurker: %d actionable bans", i);
if (i == 0)
return (0);
- VTAILQ_FOREACH_REVERSE(b, &ban_head, banhead_s, list) {
- if (DO_DEBUG(DBG_LURKER))
- VSLb(vsl, SLT_Debug, "lurker doing %f %d",
- ban_time(b->spec), b->refcount);
- while (1) {
- Lck_Lock(&ban_mtx);
- if (ban_shutdown)
- break;
- oc = VTAILQ_FIRST(&b->objcore);
- if (oc == NULL)
- break;
- CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+ /* Go though all the bans to test the objects */
+ VTAILQ_FOREACH_REVERSE(bt, &ban_head, banhead_s, list) {
+ if (bt == VTAILQ_LAST(&obans, banhead_s)) {
if (DO_DEBUG(DBG_LURKER))
- VSLb(vsl, SLT_Debug, "test: %p %u %u",
- oc, oc->flags & OC_F_LURK, pass);
- if ((oc->flags & OC_F_LURK) == pass)
- break;
- oh = oc->objhead;
- CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
- if (Lck_Trylock(&oh->mtx)) {
- Lck_Unlock(&ban_mtx);
- VSL_Flush(vsl, 0);
- VTIM_sleep(cache_param->ban_lurker_sleep);
- continue;
- }
- /*
- * See if the objcore is still on the objhead since
- * we race against HSH_Deref() which comes in the
- * opposite locking order.
- */
- VTAILQ_FOREACH(oc2, &oh->objcs, list)
- if (oc == oc2)
- break;
- if (oc2 == NULL) {
- Lck_Unlock(&oh->mtx);
- Lck_Unlock(&ban_mtx);
- VTIM_sleep(cache_param->ban_lurker_sleep);
- continue;
- }
- /*
- * If the object is busy, we can't touch
- * it. Defer it to a later run.
- */
- if (oc->flags & OC_F_BUSY) {
- oc->flags |= pass;
- VTAILQ_REMOVE(&b->objcore, oc, ban_list);
- VTAILQ_INSERT_TAIL(&b->objcore, oc, ban_list);
- Lck_Unlock(&oh->mtx);
- Lck_Unlock(&ban_mtx);
- continue;
- }
- /*
- * Grab a reference to the OC and we can let go of
- * the BAN mutex
- */
- AN(oc->refcnt);
- oc->refcnt++;
- oc->flags &= ~OC_F_LURK;
+ VSLb(vsl, SLT_Debug, "Lurk bt gone %p", bt);
+ Lck_Lock(&ban_mtx);
+ ban_mark_gone(bt);
Lck_Unlock(&ban_mtx);
- /*
- * Get the object and check it against all relevant bans
- */
- o = oc_getobj(&wrk->stats, oc);
- i = ban_check_object(o, vsl, NULL);
- if (DO_DEBUG(DBG_LURKER))
- VSLb(vsl, SLT_Debug, "lurker got: %p %d",
- oc, i);
- if (i == -1) {
- /* Not banned, not moved */
- oc->flags |= pass;
- Lck_Lock(&ban_mtx);
- VTAILQ_REMOVE(&b->objcore, oc, ban_list);
- VTAILQ_INSERT_TAIL(&b->objcore, oc, ban_list);
- Lck_Unlock(&ban_mtx);
- }
- Lck_Unlock(&oh->mtx);
- if (DO_DEBUG(DBG_LURKER))
- VSLb(vsl, SLT_Debug, "lurker done: %p %u %u",
- oc, oc->flags & OC_F_LURK, pass);
- (void)HSH_DerefObj(&wrk->stats, &o);
- VTIM_sleep(cache_param->ban_lurker_sleep);
- }
- Lck_AssertHeld(&ban_mtx);
- if (!(b->flags & BANS_FLAG_REQ)) {
- if (!(b->flags & BANS_FLAG_GONE))
- ban_mark_gone(b);
- if (DO_DEBUG(DBG_LURKER))
- VSLb(vsl, SLT_Debug, "lurker BAN %f now gone",
- ban_time(b->spec));
+ VTAILQ_REMOVE(&obans, bt, l_list);
+ if (VTAILQ_EMPTY(&obans))
+ break;
}
- Lck_Unlock(&ban_mtx);
- if (ban_shutdown)
- break;
- VTIM_sleep(cache_param->ban_lurker_sleep);
- if (b == b0)
- break;
+ if (DO_DEBUG(DBG_LURKER))
+ VSLb(vsl, SLT_Debug, "Lurk bt %p", bt);
+ ban_lurker_test_ban(wrk, vsl, bt, &obans);
}
- pass += (1 << LURK_SHIFT);
- pass &= BAN_F_LURK;
- if (pass == 0)
- pass += (1 << LURK_SHIFT);
return (1);
}
@@ -1286,9 +1303,17 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
VCLI_Out(cli, "Present bans:\n");
VTAILQ_FOREACH(b, &ban_head, list) {
- VCLI_Out(cli, "%10.6f %5u%s\t", ban_time(b->spec),
+ VCLI_Out(cli, "%10.6f %5u%s", ban_time(b->spec),
bl == b ? b->refcount - 1 : b->refcount,
- b->flags & BANS_FLAG_GONE ? "G" : " ");
+ b->flags & BANS_FLAG_GONE ? "G" : "-");
+ if (DO_DEBUG(DBG_LURKER)) {
+ VCLI_Out(cli, "%s%s%s %p ",
+ b->flags & BANS_FLAG_REQ ? "R" : "-",
+ b->flags & BANS_FLAG_OBJ ? "O" : "-",
+ b->flags & BANS_FLAG_ERROR ? "E" : "-",
+ b);
+ }
+ VCLI_Out(cli, " ");
ban_render(cli, b->spec);
VCLI_Out(cli, "\n");
if (VCLI_Overflow(cli))
@@ -1297,7 +1322,7 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv)
Lck_Lock(&ban_mtx);
struct objcore *oc;
VTAILQ_FOREACH(oc, &b->objcore, ban_list)
- VCLI_Out(cli, " %p\n", oc);
+ VCLI_Out(cli, " oc = %p\n", oc);
Lck_Unlock(&ban_mtx);
}
}
@@ -1317,14 +1342,13 @@ BAN_Init(void)
Lck_New(&ban_mtx, lck_ban);
CLI_AddFuncs(ban_cmds);
- assert(BAN_F_LURK == OC_F_LURK);
- AN((1 << LURK_SHIFT) & BAN_F_LURK);
- AN((2 << LURK_SHIFT) & BAN_F_LURK);
ban_magic = BAN_New();
AN(ban_magic);
AZ(BAN_Insert(ban_magic));
+ Lck_Lock(&ban_mtx);
ban_mark_gone(ban_magic);
+ Lck_Unlock(&ban_mtx);
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishtest/tests/c00049.vtc b/bin/varnishtest/tests/c00049.vtc
index 2e31705..3ca2b18 100644
--- a/bin/varnishtest/tests/c00049.vtc
+++ b/bin/varnishtest/tests/c00049.vtc
@@ -1,133 +1,184 @@
-varnishtest "ban lurker test"
-
+varnishtest "New ban-lurker test"
server s1 {
rxreq
- expect req.url == "/alpha"
- txresp -hdr "Foo: /alpha"
+ expect req.url == /1
+ txresp -hdr "Foo: bar1"
rxreq
- expect req.url == "/beta"
- txresp -hdr "Foo: /beta"
+ expect req.url == /2
+ txresp -hdr "Foo: bar2"
rxreq
- expect req.url == "/gamma"
- txresp -hdr "Foo: /gamma"
+ expect req.url == /3
+ txresp -hdr "Foo: bar3"
rxreq
- expect req.url == "/delta"
- txresp -hdr "Foo: /delta"
+ expect req.url == /4
+ txresp -hdr "Foo: bar4"
rxreq
- expect req.url == "/alpha"
- txresp -hdr "Foo: /alpha2"
+ expect req.url == /5
+ txresp -hdr "Foo: bar5"
rxreq
- expect req.url == "/beta"
- txresp -hdr "Foo: /beta2"
+ expect req.url == /6
+ txresp -hdr "Foo: bar6"
rxreq
- expect req.url == "/delta"
- txresp -hdr "Foo: /delta2"
+ expect req.url == /7
+ txresp -hdr "Foo: bar7"
-} -start
+ rxreq
+ expect req.url == /4
+ txresp -hdr "Foo: bar4.1"
-varnish v1 -vcl+backend {
} -start
+varnish v1 -vcl+backend {} -start
+
varnish v1 -cliok "param.set ban_lurker_sleep 0"
varnish v1 -cliok "param.set debug +lurker"
-varnish v1 -cliok "ban.list"
client c1 {
- txreq -url "/alpha"
+ txreq -url /1
rxresp
- expect resp.http.foo == /alpha
+ expect resp.http.foo == bar1
+
+ txreq -url /2
+ rxresp
+ expect resp.http.foo == bar2
} -run
-delay 0.1
-varnish v1 -cliok "ban req.url == /alpha"
-varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 2
-varnish v1 -expect bans_gone == 1
+varnish v1 -cliok "ban obj.http.foo == bar1"
client c1 {
- txreq -url "/beta"
+ txreq -url /3
rxresp
- expect resp.http.foo == /beta
+ expect resp.http.foo == bar3
} -run
-delay 0.1
-varnish v1 -cliok "ban obj.http.foo == /beta"
-varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 3
+varnish v1 -cliok "ban obj.http.foo == bar2 && obj.http.foo != foof"
client c1 {
- txreq -url "/gamma"
+ txreq -url /4
rxresp
- expect resp.http.foo == /gamma
+ expect resp.http.foo == bar4
} -run
-delay 0.1
-varnish v1 -cliok "ban obj.http.foo == /gamma"
-varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 4
+varnish v1 -cliok "ban req.http.kill == yes"
client c1 {
- txreq -url "/delta"
+ txreq -url /5
rxresp
- expect resp.http.foo == /delta
+ expect resp.http.foo == bar5
} -run
-delay 0.1
-varnish v1 -cliok "ban req.url == /delta"
+varnish v1 -cliok "ban obj.http.foo == bar5"
-varnish v1 -expect bans_gone == 1
-varnish v1 -cliok "ban obj.http.foo == /gamma"
-# Dup-check should have added one
-varnish v1 -expect bans_gone == 2
+client c1 {
+ txreq -url /6
+ rxresp
+ expect resp.http.foo == bar6
+} -run
+
+varnish v1 -cliok "ban obj.http.foo == bar6"
+
+client c1 {
+ txreq -url /7
+ rxresp
+ expect resp.http.foo == bar7
+} -run
+
+# Get the VSL out of the way
+delay .1
-varnish v1 -cliok "ban req.url == /epsilon"
varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 7
-varnish v1 -expect bans_gone == 2
+
+varnish v1 -expect bans == 6
+varnish v1 -expect bans_gone == 1
+varnish v1 -expect bans_req == 1
+varnish v1 -expect bans_obj == 4
+varnish v1 -expect bans_added == 6
+varnish v1 -expect bans_deleted == 0
+varnish v1 -expect bans_tested == 0
+varnish v1 -expect bans_tests_tested == 0
+varnish v1 -expect bans_obj_killed == 0
+varnish v1 -expect bans_lurker_tested == 0
+varnish v1 -expect bans_lurker_tests_tested == 0
+varnish v1 -expect bans_lurker_obj_killed == 0
+varnish v1 -expect bans_dups == 0
+
varnish v1 -cliok "param.set ban_lurker_sleep .01"
-delay 1
-varnish v1 -cliok "param.set ban_lurker_sleep .00"
+
+delay 2
+
varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 7
+
+varnish v1 -expect bans == 5
varnish v1 -expect bans_gone == 4
+varnish v1 -expect bans_req == 1
+varnish v1 -expect bans_obj == 4
+varnish v1 -expect bans_added == 6
+varnish v1 -expect bans_deleted == 1
+varnish v1 -expect bans_tested == 0
+varnish v1 -expect bans_tests_tested == 0
+varnish v1 -expect bans_obj_killed == 0
+varnish v1 -expect bans_lurker_tested == 10
+varnish v1 -expect bans_lurker_tests_tested == 11
+varnish v1 -expect bans_lurker_obj_killed == 4
+varnish v1 -expect bans_dups == 0
client c1 {
- txreq -url "/alpha"
+ txreq -url /3
rxresp
- expect resp.http.foo == /alpha2
+ expect resp.http.foo == bar3
} -run
+# Give lurker time to trim tail
delay 1
-varnish v1 -cliok "ban.list"
-varnish v1 -expect bans == 4
-
-client c1 {
- txreq -url "/beta"
- rxresp
- expect resp.http.foo == /beta2
-} -run
varnish v1 -cliok "ban.list"
+varnish v1 -expect bans == 4
+varnish v1 -expect bans_gone == 3
+varnish v1 -expect bans_req == 1
+varnish v1 -expect bans_obj == 3
+varnish v1 -expect bans_added == 6
+varnish v1 -expect bans_deleted == 2
+varnish v1 -expect bans_tested == 1
+varnish v1 -expect bans_tests_tested == 1
+varnish v1 -expect bans_obj_killed == 0
+varnish v1 -expect bans_lurker_tested == 10
+varnish v1 -expect bans_lurker_tests_tested == 11
+varnish v1 -expect bans_lurker_obj_killed == 4
+varnish v1 -expect bans_dups == 0
client c1 {
- txreq -url "/delta"
+ txreq -url /4 -hdr "kill: yes"
rxresp
- expect resp.http.foo == /delta2
+ expect resp.http.foo == bar4.1
} -run
+# Give lurker time to trim tail
delay 1
+
varnish v1 -cliok "ban.list"
+
varnish v1 -expect bans == 1
-varnish v1 -expect bans_gone == 0
-varnish v1 -expect bans_added == 7
-varnish v1 -expect bans_deleted == 6
+varnish v1 -expect bans_gone == 1
+varnish v1 -expect bans_req == 0
+varnish v1 -expect bans_obj == 1
+varnish v1 -expect bans_added == 6
+varnish v1 -expect bans_deleted == 5
+varnish v1 -expect bans_tested == 2
+varnish v1 -expect bans_tests_tested == 2
+varnish v1 -expect bans_obj_killed == 1
+varnish v1 -expect bans_lurker_tested == 10
+varnish v1 -expect bans_lurker_tests_tested == 11
+varnish v1 -expect bans_lurker_obj_killed == 4
+varnish v1 -expect bans_dups == 0
+
+varnish v1 -expect n_object == 3
diff --git a/bin/varnishtest/tests/r01030.vtc b/bin/varnishtest/tests/r01030.vtc
index 8b7d403..ca7ef88 100644
--- a/bin/varnishtest/tests/r01030.vtc
+++ b/bin/varnishtest/tests/r01030.vtc
@@ -40,10 +40,10 @@ client c1 {
} -run
#delay 0.1
-varnish v1 -expect bans_tests_tested == 0
+varnish v1 -expect bans_lurker_tests_tested == 0
delay 1.0
-varnish v1 -expect bans_tests_tested == 1
+varnish v1 -expect bans_lurker_tests_tested == 1
varnish v1 -cliok "param.set ban_lurker_sleep 5.01"
@@ -58,7 +58,7 @@ client c2 {
} -run
#delay 0.1
-varnish v1 -expect bans_tests_tested == 1
+varnish v1 -expect bans_lurker_tests_tested == 1
delay 1.1
-varnish v1 -expect bans_tests_tested == 2
+varnish v1 -expect bans_lurker_tests_tested == 2
diff --git a/include/tbl/vsc_f_main.h b/include/tbl/vsc_f_main.h
index 825d73e..121eaae 100644
--- a/include/tbl/vsc_f_main.h
+++ b/include/tbl/vsc_f_main.h
@@ -490,6 +490,11 @@ VSC_F(bans_gone, uint64_t, 0, 'g', diag,
"Number of bans which are no longer active, either because they"
" got checked by the ban-lurker or superseded by newer identical bans."
)
+VSC_F(bans_obj, uint64_t, 0, 'g', diag,
+ "Number of bans using obj.*",
+ "Number of bans which use obj.* variables. These bans can possibly"
+ " be washed by the ban-lurker."
+)
VSC_F(bans_req, uint64_t, 0, 'g', diag,
"Number of bans using req.*",
"Number of bans which use req.* variables. These bans can not"
@@ -505,20 +510,45 @@ VSC_F(bans_deleted, uint64_t, 0, 'c', diag,
)
VSC_F(bans_tested, uint64_t, 0, 'c', diag,
- "Bans tested against objects",
+ "Bans tested against objects (lookup)",
+ "Count of how many bans and objects have been tested against"
+ " each other during hash lookup."
+)
+VSC_F(bans_obj_killed, uint64_t, 0, 'c', diag,
+ "Objects killed by bans (lookup)",
+ "Number of objects killed by bans during object lookup."
+)
+VSC_F(bans_lurker_tested, uint64_t, 0, 'c', diag,
+ "Bans tested against objects (lurker)",
"Count of how many bans and objects have been tested against"
- " each other."
+ " each other by the ban-lurker."
)
VSC_F(bans_tests_tested, uint64_t, 0, 'c', diag,
- "Ban tests tested against objects",
+ "Ban tests tested against objects (lookup)",
"Count of how many tests and objects have been tested against"
- " each other. 'ban req.url == foo && req.http.host == bar'"
+ " each other during lookup."
+ " 'ban req.url == foo && req.http.host == bar'"
" counts as one in 'bans_tested' and as two in 'bans_tests_tested'"
)
+VSC_F(bans_lurker_tests_tested, uint64_t, 0, 'c', diag,
+ "Ban tests tested against objects (lurker)",
+ "Count of how many tests and objects have been tested against"
+ " each other by the ban-lurker."
+ " 'ban req.url == foo && req.http.host == bar'"
+ " counts as one in 'bans_tested' and as two in 'bans_tests_tested'"
+)
+VSC_F(bans_lurker_obj_killed, uint64_t, 0, 'c', diag,
+ "Objects killed by bans (lurker)",
+ "Number of objects killed by ban-lurker."
+)
VSC_F(bans_dups, uint64_t, 0, 'c', diag,
"Bans superseded by other bans",
"Count of bans replaced by later identical bans."
)
+VSC_F(bans_lurker_contention, uint64_t, 0, 'c', diag,
+ "Lurker gave way for lookup",
+ "Number of times the ban-lurker had to wait for lookups."
+)
VSC_F(bans_persisted_bytes, uint64_t, 0, 'g', diag,
"Bytes used by the persisted ban lists",
"Number of bytes used by the persisted ban lists."
More information about the varnish-commit
mailing list