[prev in list] [next in list] [prev in thread] [next in thread] 

List:       varnish-dev
Subject:    [PATCH 03/10] Truncate ban lists on smp_close(), and when full.
From:       Martin Blix Grydeland <martin () varnish-software ! com>
Date:       2012-10-10 14:27:16
Message-ID: 1349879243-30369-3-git-send-email-martin () varnish-software ! com
[Download RAW message or body]

---
 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


_______________________________________________
varnish-dev mailing list
varnish-dev@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic