[master] 856edab Give the stevedore the chance to tell which LRU list a given object should be on.

Poul-Henning Kamp phk at varnish-cache.org
Mon Feb 7 12:30:43 CET 2011


commit 856edab5225ce343069445f3f773b01ec83cd258
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Feb 7 11:30:13 2011 +0000

    Give the stevedore the chance to tell which LRU list a given object
    should be on.

diff --git a/bin/varnishd/cache_expire.c b/bin/varnishd/cache_expire.c
index 3afadea..f2f2ea4 100644
--- a/bin/varnishd/cache_expire.c
+++ b/bin/varnishd/cache_expire.c
@@ -143,7 +143,7 @@ EXP_Insert(struct object *o)
 	assert(o->entered != 0 && !isnan(o->entered));
 	o->last_lru = o->entered;
 
-	lru = STV_lru(o->objstore);
+	lru = STV_lru(o);
 	CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
 	Lck_Lock(&exp_mtx);
 	(void)update_object_when(o);
@@ -180,7 +180,7 @@ EXP_Touch(struct object *o, double tnow)
 	if (oc->flags & OC_F_LRUDONTMOVE)
 		return;
 
-	lru = STV_lru(o->objstore);
+	lru = STV_lru(o);
 	CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
 
 	if (Lck_Trylock(&exp_mtx))
diff --git a/bin/varnishd/stevedore.c b/bin/varnishd/stevedore.c
index 421f950..ef61bfd 100644
--- a/bin/varnishd/stevedore.c
+++ b/bin/varnishd/stevedore.c
@@ -283,6 +283,19 @@ STV_NewObject(struct sess *sp, const char *hint, unsigned wsl, double ttl,
 
 /*-------------------------------------------------------------------*/
 
+static struct lru *
+stv_default_getlru(const struct object *o)
+{
+
+	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(o->objstore, STORAGE_MAGIC);
+	CHECK_OBJ_NOTNULL(o->objstore->stevedore, STEVEDORE_MAGIC);
+	CHECK_OBJ_NOTNULL(o->objstore->stevedore->lru, LRU_MAGIC);
+	return (o->objstore->stevedore->lru);
+}
+
+/*-------------------------------------------------------------------*/
+
 void
 STV_Freestore(struct object *o)
 {
@@ -386,11 +399,14 @@ STV_close(void)
 }
 
 struct lru *
-STV_lru(const struct storage *st)
+STV_lru(const struct object *o)
 {
-	CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
+	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+	CHECK_OBJ_NOTNULL(o->objstore, STORAGE_MAGIC);
+	CHECK_OBJ_NOTNULL(o->objstore->stevedore, STEVEDORE_MAGIC);
+	AN(o->objstore->stevedore->getlru);
 
-	return (st->stevedore->lru);
+	return (o->objstore->stevedore->getlru(o));
 }
 
 /*--------------------------------------------------------------------
@@ -455,6 +471,8 @@ STV_Config(const char *spec)
 	AN(stv->alloc);
 	if (stv->allocobj == NULL)
 		stv->allocobj = stv_default_allocobj;
+	if (stv->getlru == NULL)
+		stv->getlru = stv_default_getlru;
 
 	if (p == NULL)
 		bprintf(stv->ident, "s%u", seq++);
diff --git a/bin/varnishd/stevedore.h b/bin/varnishd/stevedore.h
index e1c1f0d..3951050 100644
--- a/bin/varnishd/stevedore.h
+++ b/bin/varnishd/stevedore.h
@@ -43,6 +43,7 @@ typedef void storage_trim_f(struct storage *, size_t size);
 typedef void storage_free_f(struct storage *);
 typedef struct object *storage_allocobj_f(struct stevedore *, struct sess *sp,
     unsigned ltot, const struct stv_objsecrets *);
+typedef struct lru *storage_getlru_f(const struct object *);
 typedef void storage_close_f(const struct stevedore *);
 
 /* Prototypes for VCL variable responders */
@@ -58,6 +59,7 @@ struct stevedore {
 	storage_init_f		*init;		/* called by mgt process */
 	storage_open_f		*open;		/* called by cache process */
 	storage_alloc_f		*alloc;		/* --//-- */
+	storage_getlru_f	*getlru;	/* --//-- */
 	storage_trim_f		*trim;		/* --//-- */
 	storage_free_f		*free;		/* --//-- */
 	storage_close_f		*close;		/* --//-- */
@@ -86,7 +88,7 @@ void STV_trim(struct storage *st, size_t size);
 void STV_free(struct storage *st);
 void STV_open(void);
 void STV_close(void);
-struct lru *STV_lru(const struct storage *st);
+struct lru *STV_lru(const struct object *o);
 void STV_Config(const char *spec);
 void STV_Config_Transient(void);
 void STV_Freestore(struct object *o);
diff --git a/bin/varnishd/storage_persistent.c b/bin/varnishd/storage_persistent.c
index 4fc062f..8b1df91 100644
--- a/bin/varnishd/storage_persistent.c
+++ b/bin/varnishd/storage_persistent.c
@@ -1427,6 +1427,19 @@ smp_allocx(struct stevedore *st, size_t min_size, size_t max_size,
 	return (ss);
 }
 
+/*--------------------------------------------------------------------
+ * Find the per-segment lru list for this object
+ */
+
+static struct lru *
+smp_getlru(const struct object *o)
+{
+	struct smp_seg *sg;
+
+	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+	CAST_OBJ_NOTNULL(sg, o->objcore->priv, SMP_SEG_MAGIC);
+	return (sg->lru);
+}
 
 /*--------------------------------------------------------------------
  * Allocate an object
@@ -1552,6 +1565,7 @@ const struct stevedore smp_stevedore = {
 	.close	=	smp_close,
 	.alloc	=	smp_alloc,
 	.allocobj =	smp_allocobj,
+	.getlru	=	smp_getlru,
 	.free	=	smp_free,
 	.trim	=	smp_trim,
 };



More information about the varnish-commit mailing list