[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