[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