[master] d299d76 Cherry-picking from Martins obj/objcore/exp patch:

Poul-Henning Kamp phk at FreeBSD.org
Thu Jun 26 17:03:03 CEST 2014


commit d299d76867e57c19f2d86115f4335a19374339f4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Jun 26 09:24:00 2014 +0000

    Cherry-picking from Martins obj/objcore/exp patch:
    
    move n_object accounting responsibility to stevedores.
    
    Fix n_object accounting detail in persistent.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index baca07c..3721d06 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -403,7 +403,7 @@ struct storage {
 typedef struct object *getobj_f(struct dstat *ds, struct objcore *oc);
 typedef unsigned getxid_f(struct dstat *ds, struct objcore *oc);
 typedef void updatemeta_f(struct objcore *oc);
-typedef void freeobj_f(struct objcore *oc);
+typedef void freeobj_f(struct dstat *ds, struct objcore *oc);
 typedef struct lru *getlru_f(const struct objcore *oc);
 
 struct objcore_methods {
@@ -479,13 +479,14 @@ oc_updatemeta(struct objcore *oc)
 }
 
 static inline void
-oc_freeobj(struct objcore *oc)
+oc_freeobj(struct dstat *ds, struct objcore *oc)
 {
 
+	AN(ds);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(oc->methods);
 	AN(oc->methods->freeobj);
-	oc->methods->freeobj(oc);
+	oc->methods->freeobj(ds, oc);
 }
 
 static inline struct lru *
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index cd2b40d..1a34043 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -534,9 +534,8 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 	if (bo->failed && !bo->do_stream) {
 		assert(bo->state < BOS_STREAM);
 		if (bo->fetch_obj != NULL) {
-			oc_freeobj(bo->fetch_objcore);
+			oc_freeobj(bo->stats, bo->fetch_objcore);
 			bo->fetch_obj = NULL;
-			bo->stats->n_object--;
 		}
 		return (F_STP_ERROR);
 	}
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 73acf01..66fe0d5 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -804,10 +804,8 @@ HSH_DerefObjCore(struct dstat *ds, struct objcore **ocp)
 	BAN_DestroyObj(oc);
 	AZ(oc->ban);
 
-	if (oc->methods != NULL) {
-		oc_freeobj(oc);
-		ds->n_object--;
-	}
+	if (oc->methods != NULL)
+		oc_freeobj(ds, oc);
 	FREE_OBJ(oc);
 
 	ds->n_objectcore--;
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index 5e54ed6..cf75a48 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -69,11 +69,12 @@ default_oc_getobj(struct dstat *ds, struct objcore *oc)
 	return (o);
 }
 
-static void
-default_oc_freeobj(struct objcore *oc)
+static void __match_proto__(freeobj_f)
+default_oc_freeobj(struct dstat *ds, struct objcore *oc)
 {
 	struct object *o;
 
+	AN(ds);
 	CAST_OBJ_NOTNULL(o, oc->priv, OBJECT_MAGIC);
 	oc->priv = NULL;
 	oc->methods = NULL;
@@ -81,9 +82,11 @@ default_oc_freeobj(struct objcore *oc)
 
 	STV_Freestore(o);
 	STV_free(o->objstore);
+
+	ds->n_object--;
 }
 
-static struct lru *
+static struct lru * __match_proto__(getlru_f)
 default_oc_getlru(const struct objcore *oc)
 {
 	struct stevedore *stv;
@@ -285,7 +288,6 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo,
 	o->http->magic = HTTP_MAGIC;
 	o->exp = bo->exp;
 	VTAILQ_INIT(&o->store);
-	bo->stats->n_object++;
 
 	o->objcore = bo->fetch_objcore;
 
@@ -321,6 +323,7 @@ stv_default_allocobj(struct stevedore *stv, struct busyobj *bo,
 	o = STV_MkObject(stv, bo, st->ptr, ltot, soc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	o->objstore = st;
+	bo->stats->n_object++;
 	return (o);
 }
 
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index f1680a3..fcff5be 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -534,6 +534,7 @@ smp_allocobj(struct stevedore *stv, struct busyobj *bo,
 	o = STV_MkObject(stv, bo, st->ptr, ltot, soc);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	o->objstore = st;
+	bo->stats->n_object++;
 
 	oc = o->objcore;
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
diff --git a/bin/varnishd/storage/storage_persistent_silo.c b/bin/varnishd/storage/storage_persistent_silo.c
index 4ceaa6a..5627f3f 100644
--- a/bin/varnishd/storage/storage_persistent_silo.c
+++ b/bin/varnishd/storage/storage_persistent_silo.c
@@ -503,12 +503,13 @@ smp_oc_updatemeta(struct objcore *oc)
 	}
 }
 
-static void __match_proto__()
-smp_oc_freeobj(struct objcore *oc)
+static void __match_proto__(freeobj_f)
+smp_oc_freeobj(struct dstat *ds, struct objcore *oc)
 {
 	struct smp_seg *sg;
 	struct smp_object *so;
 
+	AN(ds);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 
 	CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC);
@@ -519,9 +520,14 @@ smp_oc_freeobj(struct objcore *oc)
 	so->ptr = 0;
 
 	assert(sg->nobj > 0);
-	assert(sg->nfixed > 0);
 	sg->nobj--;
-	sg->nfixed--;
+	if (oc->flags & OC_F_NEEDFIXUP) {
+		ds->n_vampireobject--;
+	} else {
+		assert(sg->nfixed > 0);
+		sg->nfixed--;
+		ds->n_object--;
+	}
 
 	Lck_Unlock(&sg->sc->mtx);
 }
@@ -530,7 +536,7 @@ smp_oc_freeobj(struct objcore *oc)
  * Find the per-segment lru list for this object
  */
 
-static struct lru *
+static struct lru * __match_proto__(getlru_f)
 smp_oc_getlru(const struct objcore *oc)
 {
 	struct smp_seg *sg;



More information about the varnish-commit mailing list