[PATCH 03/10] Truncate ban lists on smp_close(), and when full.
Martin Blix Grydeland
martin at varnish-software.com
Wed Oct 10 16:27:16 CEST 2012
---
bin/varnishd/storage/storage_persistent.c | 32 +++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index f5398b9..914de31 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -121,6 +121,33 @@ smp_offset_banlist(struct smp_sc *sc, struct smp_signspace *spc,
}
}
+/*--------------------------------------------------------------------
+ * Truncate ban1 eliminating everything up to ban1_offset. Copy to ban2
+ * and sync.
+ */
+
+static void
+smp_compact_banlists(struct smp_sc *sc)
+{
+ uint8_t *ptr, *ptr2;
+
+ if (sc->ban1_offset == 0)
+ return;
+
+ /* Compact ban1 */
+ ptr = (uint8_t *)SIGNSPACE_DATA(&sc->ban1) + sc->ban1_offset;
+ ptr2 = (uint8_t *)SIGNSPACE_FRONT(&sc->ban1);
+ assert(ptr <= ptr2);
+ memmove(SIGNSPACE_DATA(&sc->ban1), ptr, ptr2 - ptr);
+ sc->ban1_offset = 0;
+ smp_trunc_signspace(&sc->ban1, ptr2 - ptr);
+ smp_sync_sign(&sc->ban1.ctx);
+
+ /* Copy to ban2 */
+ smp_copy_signspace(&sc->ban2, &sc->ban1);
+ smp_sync_sign(&sc->ban2.ctx);
+}
+
/* Trust that cache_ban.c takes care of locking */
static void
@@ -133,6 +160,9 @@ smp_baninfo(struct stevedore *stv, enum baninfo event,
switch (event) {
case BI_NEW:
VTAILQ_FOREACH(sc, &silos, list) {
+ if (SIGNSPACE_FREE(&sc->ban1) < len + 8)
+ smp_compact_banlists(sc);
+
smp_appendban(sc, &sc->ban1, len, ban);
smp_appendban(sc, &sc->ban2, len, ban);
}
@@ -449,6 +479,8 @@ smp_close(const struct stevedore *st)
CAST_OBJ_NOTNULL(sc, st->priv, SMP_SC_MAGIC);
+ smp_compact_banlists(sc);
+
pthread_join(sc->bgthread, &status);
AZ(status);
}
--
1.7.9.5
More information about the varnish-dev
mailing list