[master] 6ed66f5 Make it possible for persistent to avoid LRU.

Poul-Henning Kamp phk at FreeBSD.org
Fri Feb 5 23:24:41 CET 2016


commit 6ed66f50d7753204e2f3b9f86a2abf3adbef548e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Feb 5 22:06:42 2016 +0000

    Make it possible for persistent to avoid LRU.

diff --git a/bin/varnishd/cache/cache_obj.h b/bin/varnishd/cache/cache_obj.h
index e61324e..830efce 100644
--- a/bin/varnishd/cache/cache_obj.h
+++ b/bin/varnishd/cache/cache_obj.h
@@ -32,7 +32,6 @@
 
 typedef void objupdatemeta_f(struct worker *, struct objcore *);
 typedef void objfree_f(struct worker *, struct objcore *);
-typedef struct lru *objgetlru_f(const struct objcore *);
 
 /* This method is only used by SML (...to get to persistent) */
 typedef struct object *sml_getobj_f(struct worker *, struct objcore *);
@@ -53,7 +52,6 @@ typedef void objtouch_f(struct worker *, struct objcore *, double now);
 
 struct obj_methods {
 	objfree_f	*objfree;
-	objgetlru_f	*objgetlru;
 	objupdatemeta_f	*objupdatemeta;
 
 	sml_getobj_f	*sml_getobj;
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index fcb8461..660f511 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -128,12 +128,10 @@ STV_open(void)
 	struct stevedore *stv;
 
 	VTAILQ_FOREACH(stv, &stv_stevedores, list) {
-		stv->lru = LRU_Alloc();
 		if (stv->open != NULL)
 			stv->open(stv);
 	}
 	stv = stv_transient;
-	stv->lru = LRU_Alloc();
 	if (stv->open != NULL)
 		stv->open(stv);
 	stv_next = VTAILQ_FIRST(&stv_stevedores);
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index fee1206..6696b01 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -58,7 +58,7 @@ struct storage {
 /* Prototypes --------------------------------------------------------*/
 
 typedef void storage_init_f(struct stevedore *, int ac, char * const *av);
-typedef void storage_open_f(const struct stevedore *);
+typedef void storage_open_f(struct stevedore *);
 typedef struct storage *storage_alloc_f(const struct stevedore *, size_t size);
 typedef void storage_free_f(struct storage *);
 typedef int storage_allocobj_f(struct worker *, const struct stevedore *,
diff --git a/bin/varnishd/storage/storage_file.c b/bin/varnishd/storage/storage_file.c
index bcd5afa..97f8403 100644
--- a/bin/varnishd/storage/storage_file.c
+++ b/bin/varnishd/storage/storage_file.c
@@ -385,14 +385,15 @@ smf_open_chunk(struct smf_sc *sc, off_t sz, off_t off, off_t *fail, off_t *sum)
 	smf_open_chunk(sc, sz - h, off + h, fail, sum);
 }
 
-static void
-smf_open(const struct stevedore *st)
+static void __match_proto__(storage_open_f)
+smf_open(struct stevedore *st)
 {
 	struct smf_sc *sc;
 	off_t fail = 1 << 30;	/* XXX: where is OFF_T_MAX ? */
 	off_t sum = 0;
 
 	ASSERT_CLI();
+	st->lru = LRU_Alloc();
 	if (lck_smf == NULL)
 		lck_smf = Lck_CreateClass("smf");
 	CAST_OBJ_NOTNULL(sc, st->priv, SMF_SC_MAGIC);
diff --git a/bin/varnishd/storage/storage_lru.c b/bin/varnishd/storage/storage_lru.c
index 54b8619..987a0f1 100644
--- a/bin/varnishd/storage/storage_lru.c
+++ b/bin/varnishd/storage/storage_lru.c
@@ -50,11 +50,7 @@ lru_get(const struct objcore *oc)
 {
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(oc->stobj->stevedore, STEVEDORE_MAGIC);
-	AN(oc->stobj->stevedore->methods);
-	const struct obj_methods *m = oc->stobj->stevedore->methods;
-
-	if(m->objgetlru != NULL)
-		return (m->objgetlru(oc));
+	CHECK_OBJ_NOTNULL(oc->stobj->stevedore->lru, LRU_MAGIC);
 	return (oc->stobj->stevedore->lru);
 }
 
diff --git a/bin/varnishd/storage/storage_malloc.c b/bin/varnishd/storage/storage_malloc.c
index 19a8ac4..7c7efd7 100644
--- a/bin/varnishd/storage/storage_malloc.c
+++ b/bin/varnishd/storage/storage_malloc.c
@@ -198,12 +198,13 @@ sma_init(struct stevedore *parent, int ac, char * const *av)
 	sc->sma_max = u;
 }
 
-static void
-sma_open(const struct stevedore *st)
+static void __match_proto__(storage_open_f)
+sma_open(struct stevedore *st)
 {
 	struct sma_sc *sma_sc;
 
 	ASSERT_CLI();
+	st->lru = LRU_Alloc();
 	if (lck_sma == NULL)
 		lck_sma = Lck_CreateClass("sma");
 	CAST_OBJ_NOTNULL(sma_sc, st->priv, SMA_SC_MAGIC);
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index fed7243..20a4aec 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -234,8 +234,7 @@ smp_open_segs(struct smp_sc *sc, struct smp_signspace *spc)
 	for(; ss <= se; ss++) {
 		ALLOC_OBJ(sg, SMP_SEG_MAGIC);
 		AN(sg);
-		sg->lru = LRU_Alloc();
-		AN(sg->lru);
+		VTAILQ_INIT(&sg->objcores);
 		sg->p = *ss;
 
 		sg->flags |= SMP_SEG_MUSTLOAD;
@@ -320,8 +319,8 @@ smp_thread(struct worker *wrk, void *priv)
  * Open a silo in the worker process
  */
 
-static void
-smp_open(const struct stevedore *st)
+static void __match_proto__(storage_open_f)
+smp_open(struct stevedore *st)
 {
 	struct smp_sc	*sc;
 
@@ -569,6 +568,7 @@ smp_allocobj(struct worker *wrk, const struct stevedore *stv,
 
 	smp_init_oc(oc, sg, objidx);
 
+	VTAILQ_INSERT_TAIL(&sg->objcores, oc, lru_list);
 	Lck_Unlock(&sc->mtx);
 	return (1);
 }
@@ -689,7 +689,6 @@ SMP_Init(void)
 	smp_oc_realmethods.sml_getobj = smp_oc_methods.sml_getobj;
 	smp_oc_realmethods.objupdatemeta = smp_oc_methods.objupdatemeta;
 	smp_oc_realmethods.objfree = smp_oc_methods.objfree;
-	smp_oc_realmethods.objgetlru = smp_oc_methods.objgetlru;
 	smp_oc_realmethods.objtouch = NULL;
 }
 
diff --git a/bin/varnishd/storage/storage_persistent.h b/bin/varnishd/storage/storage_persistent.h
index b20ef02..4a28ba6 100644
--- a/bin/varnishd/storage/storage_persistent.h
+++ b/bin/varnishd/storage/storage_persistent.h
@@ -193,7 +193,7 @@ struct smp_seg {
 #define SMP_SEG_MAGIC		0x45c61895
 
 	struct smp_sc		*sc;
-	struct lru		*lru;
+	VTAILQ_HEAD(,objcore)	objcores;
 
 	VTAILQ_ENTRY(smp_seg)	list;		/* on smp_sc.smp_segments */
 
diff --git a/bin/varnishd/storage/storage_persistent_silo.c b/bin/varnishd/storage/storage_persistent_silo.c
index deb1340..74b74fe 100644
--- a/bin/varnishd/storage/storage_persistent_silo.c
+++ b/bin/varnishd/storage/storage_persistent_silo.c
@@ -106,7 +106,7 @@ smp_save_segs(struct smp_sc *sc)
 		if (sg == sc->cur_seg)
 			continue;
 		VTAILQ_REMOVE(&sc->segments, sg, list);
-		LRU_Free(&sg->lru);
+		AN(VTAILQ_EMPTY(&sg->objcores));
 		FREE_OBJ(sg);
 	}
 	smp_save_seg(sc, &sc->seg1);
@@ -163,6 +163,7 @@ smp_load_seg(struct worker *wrk, const struct smp_sc *sc,
 		oc->flags &= ~OC_F_BUSY;
 		oc->stobj->stevedore = sc->parent;
 		smp_init_oc(oc, sg, no);
+		VTAILQ_INSERT_TAIL(&sg->objcores, oc, lru_list);
 		oc->stobj->priv2 |= NEED_FIXUP;
 		oc->ban = BAN_RefBan(oc, so->ban);
 		oc->exp = so->exp;
@@ -170,9 +171,7 @@ smp_load_seg(struct worker *wrk, const struct smp_sc *sc,
 		oc->refcnt++;
 		HSH_Insert(wrk, so->hash, oc);
 		EXP_Insert(wrk, oc);
-		AN(isnan(oc->last_lru));
 		HSH_DerefBoc(wrk, oc);	// XXX Keep it an stream resurrection?
-		AZ(isnan(oc->last_lru));
 		(void)HSH_DerefObjCore(wrk, &oc);
 	}
 	Pool_Sumstat(wrk);
@@ -224,11 +223,9 @@ smp_new_seg(struct smp_sc *sc)
 
 	ALLOC_OBJ(sg, SMP_SEG_MAGIC);
 	if (sg == NULL)
-		/* Failed allocation */
 		return;
 	*sg = tmpsg;
-	sg->lru = LRU_Alloc();
-	AN(sg->lru);
+	VTAILQ_INIT(&sg->objcores);
 
 	sg->p.offset = IRNUP(sc, sg->p.offset);
 	sg->p.length -= sg->p.offset - tmpsg.p.offset;
@@ -277,7 +274,7 @@ smp_close_seg(struct smp_sc *sc, struct smp_seg *sg)
 		assert(sg->p.offset >= sc->ident->stuff[SMP_SPC_STUFF]);
 		assert(sg->p.offset < sc->mediasize);
 		sc->free_offset = sg->p.offset;
-		LRU_Free(&sg->lru);
+		AN(VTAILQ_EMPTY(&sg->objcores));
 		FREE_OBJ(sg);
 		return;
 	}
@@ -509,31 +506,16 @@ smp_oc_objfree(struct worker *wrk, struct objcore *oc)
 		sg->nfixed--;
 		wrk->stats->n_object--;
 	}
-	AZ(isnan(oc->last_lru));
-	LRU_Remove(oc);
+	VTAILQ_REMOVE(&sg->objcores, oc, lru_list);
 
 	Lck_Unlock(&sg->sc->mtx);
 	memset(oc->stobj, 0, sizeof oc->stobj);
 }
 
-/*--------------------------------------------------------------------
- * Find the per-segment lru list for this object
- */
-
-static struct lru * __match_proto__(objgetlru_f)
-smp_oc_objgetlru(const struct objcore *oc)
-{
-	struct smp_seg *sg;
-
-	CAST_OBJ_NOTNULL(sg, oc->stobj->priv, SMP_SEG_MAGIC);
-	return (sg->lru);
-}
-
 const struct obj_methods smp_oc_methods = {
 	.sml_getobj =		smp_oc_sml_getobj,
 	.objupdatemeta =	smp_oc_objupdatemeta,
 	.objfree =		smp_oc_objfree,
-	.objgetlru =		smp_oc_objgetlru,
 };
 
 /*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/storage/storage_simple.c b/bin/varnishd/storage/storage_simple.c
index b588798..42112e7 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -206,7 +206,7 @@ sml_objfree(struct worker *wrk, struct objcore *oc)
 	CAST_OBJ_NOTNULL(o, oc->stobj->priv, OBJECT_MAGIC);
 	o->magic = 0;
 
-	if (oc->boc == NULL)
+	if (oc->boc == NULL && oc->stobj->stevedore->lru != NULL)
 		LRU_Remove(oc);
 
 	sml_stv_free(oc->stobj->stevedore, o->objstore);
@@ -329,6 +329,8 @@ objallocwithnuke(struct worker *wrk, const struct stevedore *stv, size_t size)
 			break;
 
 		/* no luck; try to free some space and keep trying */
+		if (stv->lru == NULL)
+			break;
 		if (fail < cache_param->nuke_limit &&
 		    !LRU_NukeOne(wrk, stv->lru))
 			break;
@@ -457,18 +459,19 @@ sml_stable(struct worker *wrk, struct objcore *oc, struct boc *boc)
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(boc, BOC_MAGIC);
+	stv = oc->stobj->stevedore;
+	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
 
 	if (boc->stevedore_priv != NULL) {
 		/* Free any leftovers from Trim */
 		CAST_OBJ_NOTNULL(st, boc->stevedore_priv, STORAGE_MAGIC);
 		boc->stevedore_priv = 0;
 		CHECK_OBJ_NOTNULL(st, STORAGE_MAGIC);
-		stv = oc->stobj->stevedore;
-		CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
 		sml_stv_free(stv, st);
 	}
 
-	LRU_Add(oc, wrk->lastused);	// approx timestamp is OK
+	if (stv->lru != NULL)
+		LRU_Add(oc, wrk->lastused);	// approx timestamp is OK
 }
 
 static void * __match_proto__(objgetattr_f)



More information about the varnish-commit mailing list