r3899 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Mon Mar 9 11:57:45 CET 2009


Author: phk
Date: 2009-03-09 11:57:45 +0100 (Mon, 09 Mar 2009)
New Revision: 3899

Modified:
   trunk/varnish-cache/bin/varnishd/storage_persistent.c
Log:
Close segment when silo is closed.



Modified: trunk/varnish-cache/bin/varnishd/storage_persistent.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/storage_persistent.c	2009-03-09 10:32:23 UTC (rev 3898)
+++ trunk/varnish-cache/bin/varnishd/storage_persistent.c	2009-03-09 10:57:45 UTC (rev 3899)
@@ -65,6 +65,8 @@
 	uint64_t		offset;
 	uint64_t		length;
 	struct smp_segment	segment;
+	uint32_t		nalloc;
+	uint64_t		next_addr;
 };
 
 struct smp_sc {
@@ -83,7 +85,6 @@
 
 	VTAILQ_HEAD(, smp_seg)	segments;
 	struct smp_seg		*cur_seg;
-	uint64_t		next_addr;
 };
 
 /*--------------------------------------------------------------------
@@ -462,14 +463,33 @@
 
 	/* Set up our allocation point */
 	sc->cur_seg = sg;
-	sc->next_addr = sg->offset +
+	sg->next_addr = sg->offset +
 	    sizeof (struct smp_sign) +
 	    sizeof (struct smp_segment) +
 	    SHA256_LEN;
-	memcpy(sc->ptr + sc->next_addr, "HERE", 4);
+	memcpy(sc->ptr + sg->next_addr, "HERE", 4);
 }
 
 /*--------------------------------------------------------------------
+ * Close a segment
+ */
+
+static void
+smp_close_seg(struct smp_sc *sc, struct smp_seg *sg)
+{
+	void *ptr;
+	uint64_t length;
+
+	(void)sc;
+	sg->segment.objlist = sg->next_addr;
+	sg->segment.nalloc = sg->nalloc;
+	(void)smp_open_sign(sc, sg->offset, &ptr, &length, "SEGMENT");
+	memcpy(ptr, &sg->segment, sizeof sg->segment);
+	smp_create_sign(sc, sg->offset, sizeof sg->segment, "SEGMENT");
+	smp_sync_sign(sc, sg->offset, sizeof sg->segment);
+}
+
+/*--------------------------------------------------------------------
  * Open a silo in the worker process
  */
 
@@ -504,7 +524,11 @@
 static void
 smp_close(const struct stevedore *st)
 {
+	struct smp_sc	*sc;
+
+	CAST_OBJ_NOTNULL(sc, st->priv, SMP_SC_MAGIC);
 fprintf(stderr, "Close Silo(%p)\n", st);
+	smp_close_seg(sc, sc->cur_seg);
 }
 
 /*--------------------------------------------------------------------
@@ -514,6 +538,14 @@
 static void
 smp_object(const struct sess *sp)
 {
+	struct smp_sc	*sc;
+	CHECK_OBJ_NOTNULL(sp->obj, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->obj->objstore, STORAGE_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->obj->objstore->stevedore, STEVEDORE_MAGIC);
+	CAST_OBJ_NOTNULL(sc, sp->obj->objstore->priv, SMP_SC_MAGIC);
+
+	sc->cur_seg->nalloc++;
+
 fprintf(stderr, "Object(%p %p)\n", sp, sp->obj);
 }
 
@@ -526,14 +558,16 @@
 {
 	struct smp_sc *sc;
 	struct storage *ss;
+	struct smp_seg *sg;
 
 	CAST_OBJ_NOTNULL(sc, st->priv, SMP_SC_MAGIC);
+	sg = sc->cur_seg;
 
 	/* XXX: size fit check */
-	AN(sc->next_addr);
+	AN(sg->next_addr);
 
 	/* Grab and fill a storage structure */
-	ss = (void *)(sc->ptr + sc->next_addr);
+	ss = (void *)(sc->ptr + sg->next_addr);
 	memset(ss, 0, sizeof *ss);
 	ss->magic = STORAGE_MAGIC;
 	ss->space = size;
@@ -541,10 +575,10 @@
 	ss->priv = sc;
 	ss->stevedore = st;
 	ss->fd = sc->fd;
-	ss->where = sc->next_addr + sizeof *ss;
+	ss->where = sg->next_addr + sizeof *ss;
 
-	sc->next_addr += size + sizeof *ss;
-	memcpy(sc->ptr + sc->next_addr, "HERE", 4);
+	sg->next_addr += size + sizeof *ss;
+	memcpy(sc->ptr + sg->next_addr, "HERE", 4);
 	return (ss);
 }
 
@@ -552,18 +586,21 @@
 smp_trim(struct storage *ss, size_t size)
 {
 	struct smp_sc *sc;
+	struct smp_seg *sg;
 
 fprintf(stderr, "Trim(%p %u)\n", ss, size);
 	CAST_OBJ_NOTNULL(sc, ss->priv, SMP_SC_MAGIC);
+	sg = sc->cur_seg;
 
 	/* We want 16 bytes alignment */
 	size |= 0xf;
 	size += 1;
 
-	if (ss->ptr + ss->space == sc->next_addr + sc->ptr) {
-		sc->next_addr -= ss->space - size;
+	if (ss->ptr + ss->space == sg->next_addr + sc->ptr) {
+		memcpy(sc->ptr + sg->next_addr, "\0\0\0\0", 4);
+		sg->next_addr -= ss->space - size;
 		ss->space = size;
-		memcpy(sc->ptr + sc->next_addr, "HERE", 4);
+		memcpy(sc->ptr + sg->next_addr, "HERE", 4);
 	}
 }
 



More information about the varnish-commit mailing list