---
bin/varnishd/storage/storage_persistent.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/bin/varnishd/storage/storage_persistent.c
b/bin/varnishd/storage/storage_persistent.c
index 86b94f8..bc11637 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -68,6 +68,8 @@ static VTAILQ_HEAD(,smp_sc) silos =
VTAILQ_HEAD_INITIALIZER(silos);
* Add bans to silos
*/
+static void smp_recompile_bans(struct smp_sc *sc, const struct ban *tail);
+
static void
smp_appendban(struct smp_sc *sc, struct smp_signspace *spc,
uint32_t len, const uint8_t *ban)
@@ -108,9 +110,18 @@ smp_baninfo(struct stevedore *stv, enum baninfo event,
const struct ban *ban)
switch (event) {
case BI_NEW:
BAN_Spec(ban, &spec, &len);
- smp_appendban(sc, &sc->ban1, len, spec);
- smp_appendban(sc, &sc->ban2, len, spec);
- sc->n_ban++;
+ if (SIGNSPACE_FREE(&sc->ban1) < 4 + 4 + len) {
+ /* Assert unless the recompiled ban lists
+ * frees/truncates at least 10% of the
+ * bans */
+ assert(sc->n_ban_dropped + sc->n_ban_gone >=
+ sc->n_ban / 10);
+ smp_recompile_bans(sc, BAN_Prev(NULL));
+ } else {
+ smp_appendban(sc, &sc->ban1, len, spec);
+ smp_appendban(sc, &sc->ban2, len, spec);
+ sc->n_ban++;
+ }
break;
case BI_DROP:
sc->n_ban_dropped++;
--
1.7.9.5
_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev