r4211 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Wed Aug 26 23:13:17 CEST 2009


Author: phk
Date: 2009-08-26 23:13:16 +0200 (Wed, 26 Aug 2009)
New Revision: 4211

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_expire.c
   trunk/varnish-cache/bin/varnishd/common.h
   trunk/varnish-cache/bin/varnishd/stevedore.c
   trunk/varnish-cache/bin/varnishd/stevedore.h
   trunk/varnish-cache/bin/varnishd/storage_persistent.c
Log:
Counter-intuitively change the LRU list from a VTAILQ to a VLIST.

The cruical difference is that we can remove from a VLIST without
having the head of the VLIST, which comes handy when expiring a
non-instantiated object from a -spersistent stevedore.

We flip the LRU list around, so that the frontmost element has not
been accessed for the longest time, and simulate tail-inserts by
putting a senteniel on the tail of the list.

Presently the senteniel is a full objcore, which is a non-issue with
few machines having more than a handful of stevedores, but once the
persistent stevedore moves to per-segment LRU lists, this needs to
be addressed, probably by wrapping the LRU linkage in a separate
structure.


Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2009-08-26 21:13:16 UTC (rev 4211)
@@ -290,7 +290,7 @@
 #define OC_F_PERSISTENT		(1<<3)
 	unsigned		timer_idx;
 	VTAILQ_ENTRY(objcore)	list;
-	VTAILQ_ENTRY(objcore)	lru_list;
+	VLIST_ENTRY(objcore)	lru_list;
 	VTAILQ_ENTRY(objcore)	ban_list;
 	struct smp_seg		*smp_seg;
 	struct ban		*ban;
@@ -488,11 +488,11 @@
 
 /* cache_expiry.c */
 void EXP_Insert(struct object *o);
-void EXP_Inject(struct objcore *oc, struct objcore_head *lru, double ttl);
+void EXP_Inject(struct objcore *oc, struct objcore *lrut, double ttl);
 void EXP_Init(void);
 void EXP_Rearm(const struct object *o);
 int EXP_Touch(const struct object *o);
-int EXP_NukeOne(struct sess *sp, struct objcore_head *lru);
+int EXP_NukeOne(struct sess *sp, const struct objcore_head *lru);
 
 /* cache_fetch.c */
 int FetchHdr(struct sess *sp);

Modified: trunk/varnish-cache/bin/varnishd/cache_expire.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_expire.c	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/cache_expire.c	2009-08-26 21:13:16 UTC (rev 4211)
@@ -97,7 +97,7 @@
  */
 
 void
-EXP_Inject(struct objcore *oc, struct objcore_head *lru, double ttl)
+EXP_Inject(struct objcore *oc, struct objcore *lrut, double ttl)
 {
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
@@ -107,10 +107,8 @@
 	oc->timer_when = ttl;
 	binheap_insert(exp_heap, oc);
 	assert(oc->timer_idx != BINHEAP_NOIDX);
-	if (lru != NULL) {
-		VTAILQ_INSERT_TAIL(lru, oc, lru_list);
-		oc->flags |= OC_F_ONLRU;
-	}
+	VLIST_INSERT_BEFORE(lrut, oc, lru_list);
+	oc->flags |= OC_F_ONLRU;
 	Lck_Unlock(&exp_mtx);
 }
 
@@ -124,8 +122,7 @@
 void
 EXP_Insert(struct object *o)
 {
-	struct objcore *oc;
-	struct objcore_head *lru;
+	struct objcore *oc, *lrut;
 
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
@@ -136,14 +133,15 @@
 
 	assert(o->entered != 0 && !isnan(o->entered));
 	o->last_lru = o->entered;
+	lrut = STV_lru(o->objstore);
 	Lck_Lock(&exp_mtx);
 	assert(oc->timer_idx == BINHEAP_NOIDX);
 	(void)update_object_when(o);
 	binheap_insert(exp_heap, oc);
 	assert(oc->timer_idx != BINHEAP_NOIDX);
-	lru = STV_lru(o->objstore);
-	if (lru != NULL) {
-		VTAILQ_INSERT_TAIL(lru, oc, lru_list);
+	if (o->objstore != NULL) {
+		CHECK_OBJ_NOTNULL(lrut, OBJCORE_MAGIC);
+		VLIST_INSERT_BEFORE(lrut, oc, lru_list);
 		oc->flags |= OC_F_ONLRU;
 	}
 	Lck_Unlock(&exp_mtx);
@@ -163,24 +161,25 @@
 int
 EXP_Touch(const struct object *o)
 {
-	struct objcore *oc;
 	int retval = 0;
-	struct objcore_head *lru;
+	struct objcore *oc, *lrut;
 
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	oc = o->objcore;
 	if (oc == NULL)
 		return (retval);
-	lru = STV_lru(o->objstore);
-	if (lru == NULL)
-		return (retval);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	/* We must have an objhead, otherwise we have no business on a LRU */
 	CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC);
+	if (o->objstore == NULL)	/* XXX ?? */
+		return (retval);
+	lrut = STV_lru(o->objstore);
+	CHECK_OBJ_NOTNULL(lrut, OBJCORE_MAGIC);
 	if (Lck_Trylock(&exp_mtx))
 		return (retval);
-	if (oc->flags & OC_F_ONLRU) {
-		VTAILQ_REMOVE(lru, oc, lru_list);
-		VTAILQ_INSERT_TAIL(lru, oc, lru_list);
+	if (oc->flags & OC_F_ONLRU) {	/* XXX ?? */
+		VLIST_REMOVE(oc, lru_list);
+		VLIST_INSERT_BEFORE(lrut, oc, lru_list);
 		VSL_stats->n_lru_moved++;
 		retval = 1;
 	}
@@ -243,7 +242,6 @@
 	struct objcore *oc;
 	struct object *o;
 	double t;
-	struct objcore_head *lru;
 
 	(void)priv;
 	VCL_Get(&sp->vcl);
@@ -273,16 +271,9 @@
 
 		/* And from LRU */
 		if (oc->flags & OC_F_ONLRU) {
-			assert(!(oc->flags & OC_F_PERSISTENT));
-			o = oc->obj;
-			lru = STV_lru(o->objstore);
-			AN(lru);
-			VTAILQ_REMOVE(lru, o->objcore, lru_list);
+			VLIST_REMOVE(oc, lru_list);
 			oc->flags &= ~OC_F_ONLRU;
-		} else {
-			o = NULL;
-			assert(oc->flags & OC_F_PERSISTENT);
-		}
+		} 
 
 		VSL_stats->n_expired++;
 
@@ -296,8 +287,8 @@
 			    o->xid, (int)(o->ttl - t));
 			HSH_Deref(sp->wrk, &o);
 		} else {
-			WSL(sp->wrk, SLT_ExpKill, 1, "%u %d",
-			    o, (int)(oc->timer_when - t));
+			WSL(sp->wrk, SLT_ExpKill, 1, "-1 %d",
+			    (int)(oc->timer_when - t));
 			sp->objhead = oc->objhead;
 			sp->objcore = oc;
 			HSH_DerefObjCore(sp);
@@ -312,7 +303,7 @@
  */
 
 int
-EXP_NukeOne(struct sess *sp, struct objcore_head *lru)
+EXP_NukeOne(struct sess *sp, const struct objcore_head *lru)
 {
 	struct objcore *oc;
 
@@ -327,7 +318,7 @@
 	 *
 	 */
 	Lck_Lock(&exp_mtx);
-	VTAILQ_FOREACH(oc, lru, lru_list) {
+	VLIST_FOREACH(oc, lru, lru_list) {
 		CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 		if (oc->timer_idx == BINHEAP_NOIDX)	/* exp_timer has it */
 			continue;
@@ -335,7 +326,7 @@
 			break;
 	}
 	if (oc != NULL) {
-		VTAILQ_REMOVE(lru, oc, lru_list);
+		VLIST_REMOVE(oc, lru_list);
 		oc->flags &= ~OC_F_ONLRU;
 		binheap_delete(exp_heap, oc->timer_idx);
 		assert(oc->timer_idx == BINHEAP_NOIDX);

Modified: trunk/varnish-cache/bin/varnishd/common.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/common.h	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/common.h	2009-08-26 21:13:16 UTC (rev 4211)
@@ -67,5 +67,5 @@
 
 /* Sort of hack-ish... */
 struct objcore;
-VTAILQ_HEAD(objcore_head, objcore);
+VLIST_HEAD(objcore_head, objcore);
 

Modified: trunk/varnish-cache/bin/varnishd/stevedore.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/stevedore.c	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/stevedore.c	2009-08-26 21:13:16 UTC (rev 4211)
@@ -124,7 +124,9 @@
 	*stv = *stv2;
 	AN(stv->name);
 	AN(stv->alloc);
-	VTAILQ_INIT(&stv->lru);
+	ALLOC_OBJ(stv->lru_tail, OBJCORE_MAGIC);
+	VLIST_INIT(&stv->lru);
+	VLIST_INSERT_HEAD(&stv->lru, stv->lru_tail, lru_list);
 
 	if (stv->init != NULL)
 		stv->init(stv, ac, av);
@@ -159,14 +161,12 @@
 	}
 }
 
-struct objcore_head *
+struct objcore *
 STV_lru(struct storage *st)
 {
-	if (st == NULL)
-		return (NULL);
-	CHECK_OBJ(st, STORAGE_MAGIC);
+	CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
 
-	return (&st->stevedore->lru);
+	return (st->stevedore->lru_tail);
 }
 
 const struct choice STV_choice[] = {

Modified: trunk/varnish-cache/bin/varnishd/stevedore.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/stevedore.h	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/stevedore.h	2009-08-26 21:13:16 UTC (rev 4211)
@@ -55,6 +55,7 @@
 	storage_close_f		*close;
 
 	struct objcore_head	lru;
+	struct objcore		*lru_tail;
 
 	/* private fields */
 	void			*priv;
@@ -68,8 +69,9 @@
 void STV_add(const struct stevedore *stv, int ac, char * const *av);
 void STV_open(void);
 void STV_close(void);
-struct objcore_head *STV_lru(struct storage *st);
+struct objcore *STV_lru(struct storage *st);
 
+
 int STV_GetFile(const char *fn, int *fdp, const char **fnp, const char *ctx);
 uintmax_t STV_FileSize(int fd, const char *size, unsigned *granularity, const char *ctx);
 

Modified: trunk/varnish-cache/bin/varnishd/storage_persistent.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/storage_persistent.c	2009-08-26 11:12:48 UTC (rev 4210)
+++ trunk/varnish-cache/bin/varnishd/storage_persistent.c	2009-08-26 21:13:16 UTC (rev 4211)
@@ -113,6 +113,7 @@
 struct smp_sc {
 	unsigned		magic;
 #define SMP_SC_MAGIC		0x7b73af0a 
+	struct stevedore	*parent;
 
 	unsigned		flags;
 #define SMP_F_LOADED		(1 << 0)
@@ -519,6 +520,7 @@
 	/* Allocate softc */
 	ALLOC_OBJ(sc, SMP_SC_MAGIC);
 	XXXAN(sc);
+	sc->parent = parent;
 	sc->fd = -1;
 	VTAILQ_INIT(&sc->segments);
 
@@ -834,7 +836,7 @@
 		oc->ban = BAN_RefBan(oc, so->ban, sc->tailban);
 		memcpy(sp->wrk->nobjhead->digest, so->hash, SHA256_LEN);
 		(void)HSH_Insert(sp);
-		EXP_Inject(oc, NULL, so->ttl);
+		EXP_Inject(oc, sc->parent->lru_tail, so->ttl);
 		sg->nalloc++;
 	}
 	WRK_SumStat(sp->wrk);



More information about the varnish-commit mailing list