[master] 9268784 Push space allocation for objects into cache_obj.c as well.

Poul-Henning Kamp phk at FreeBSD.org
Tue Aug 19 11:43:47 CEST 2014


commit 9268784cb4be73b328ac294cf78e0a6d2b0932c9
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Aug 19 09:43:28 2014 +0000

    Push space allocation for objects into cache_obj.c as well.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2026cd8..b85cde6 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1061,6 +1061,8 @@ enum objiter_status {
 struct objiter *ObjIterBegin(struct worker *, struct objcore *);
 enum objiter_status ObjIter(struct objiter *, void **, ssize_t *);
 void ObjIterEnd(struct objiter **);
+struct storage *ObjGetSpace(struct objcore *, struct vsl_log *vsl,
+    struct dstat *, ssize_t sz);
 void ObjExtend(struct objcore *, struct dstat *, ssize_t l);
 void ObjTrimStore(struct objcore *, struct dstat *);
 unsigned ObjGetXID(struct objcore *, struct dstat *);
@@ -1245,7 +1247,7 @@ void RFC2616_Weaken_Etag(struct http *hp);
 
 /* stevedore.c */
 struct object *STV_NewObject(struct busyobj *, const char *hint, unsigned len);
-struct storage *STV_alloc(const struct vfp_ctx *, size_t size);
+struct storage *STV_alloc(struct stevedore *, size_t size);
 void STV_trim(struct storage *st, size_t size, int move_ok);
 void STV_free(struct storage *st);
 void STV_open(void);
diff --git a/bin/varnishd/cache/cache_fetch_proc.c b/bin/varnishd/cache/cache_fetch_proc.c
index 5c42c83..7462105 100644
--- a/bin/varnishd/cache/cache_fetch_proc.c
+++ b/bin/varnishd/cache/cache_fetch_proc.c
@@ -92,15 +92,9 @@ VFP_GetStorage(struct vfp_ctx *vc, ssize_t sz)
 		l = sz;
 	if (l == 0)
 		l = cache_param->fetch_chunksize;
-	st = STV_alloc(vc, l);
-	if (st == NULL) {
+	st = ObjGetSpace(vc->oc, vc->vsl, vc->stats, l);
+	if (st == NULL)
 		(void)VFP_Error(vc, "Could not get storage");
-	} else {
-		AZ(st->len);
-		Lck_Lock(&vc->bo->mtx);
-		VTAILQ_INSERT_TAIL(&vc->body->list, st, list);
-		Lck_Unlock(&vc->bo->mtx);
-	}
 	return (st);
 }
 
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index ed47b1e..a89a4ab 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -35,7 +35,6 @@
 #include "storage/storage.h"
 #include "hash/hash_slinger.h"
 
-
 static const struct objcore_methods *
 obj_getmethods(const struct objcore *oc)
 {
@@ -169,6 +168,73 @@ ObjIterEnd(struct objiter **oi)
 /*--------------------------------------------------------------------
  */
 
+static struct storage *
+objallocwithnuke(struct stevedore *stv, struct vsl_log *vsl, struct dstat *ds,
+    size_t size)
+{
+	struct storage *st = NULL;
+	unsigned fail;
+
+	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
+
+	if (size > cache_param->fetch_maxchunksize)
+		size = cache_param->fetch_maxchunksize;
+
+	assert(size <= UINT_MAX);	/* field limit in struct storage */
+
+	for (fail = 0; fail <= cache_param->nuke_limit; fail++) {
+		/* try to allocate from it */
+		AN(stv->alloc);
+		st = STV_alloc(stv, size);
+		if (st != NULL)
+			break;
+
+		/* no luck; try to free some space and keep trying */
+		if (fail < cache_param->nuke_limit &&
+		    EXP_NukeOne(vsl, ds, stv->lru) == -1)
+			break;
+	}
+	CHECK_OBJ_ORNULL(st, STORAGE_MAGIC);
+	return (st);
+}
+
+/*--------------------------------------------------------------------
+ */
+
+struct storage *
+ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
+    ssize_t sz)
+{
+	struct object *o;
+	struct storage *st;
+
+	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	AN(ds);
+	o = obj_getobj(oc, ds);
+	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
+
+	st = VTAILQ_LAST(&o->body->list, storagehead);
+	if (st != NULL && st->len < st->space)
+		return (st);
+
+	st = objallocwithnuke(o->body->stevedore, vsl, ds, sz);
+	if (st == NULL)
+		return (st);
+
+	if (oc->busyobj != NULL) {
+		CHECK_OBJ_NOTNULL(oc->busyobj, BUSYOBJ_MAGIC);
+		Lck_Lock(&oc->busyobj->mtx);
+		VTAILQ_INSERT_TAIL(&o->body->list, st, list);
+		Lck_Unlock(&oc->busyobj->mtx);
+	} else {
+		VTAILQ_INSERT_TAIL(&o->body->list, st, list);
+	}
+	return (st);
+}
+
+/*--------------------------------------------------------------------
+ */
+
 void
 ObjExtend(struct objcore *oc, struct dstat *ds, ssize_t l)
 {
@@ -176,7 +242,6 @@ ObjExtend(struct objcore *oc, struct dstat *ds, ssize_t l)
 	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-
 	o = obj_getobj(oc, ds);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	st = VTAILQ_LAST(&o->body->list, storagehead);
@@ -325,7 +390,8 @@ ObjSetattr(const struct vfp_ctx *vc, enum obj_attr attr, ssize_t len,
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	switch (attr) {
 	case OA_ESIDATA:
-		o->esidata = STV_alloc(vc, len);
+		o->esidata = objallocwithnuke(o->body->stevedore, vc->vsl,
+		    vc->stats, len);
 		if (o->esidata == NULL)
 			return (NULL);
 		o->esidata->len = len;
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index bbec41a..4fd40a4 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -152,8 +152,8 @@ stv_pick_stevedore(struct vsl_log *vsl, const char **hint)
 
 /*-------------------------------------------------------------------*/
 
-static struct storage *
-stv_alloc(struct stevedore *stv, size_t size)
+struct storage *
+STV_alloc(struct stevedore *stv, size_t size)
 {
 	struct storage *st;
 
@@ -180,45 +180,6 @@ stv_alloc(struct stevedore *stv, size_t size)
 	return (st);
 }
 
-/*-------------------------------------------------------------------*/
-
-static struct storage *
-stv_alloc_obj(const struct vfp_ctx *vc, size_t size)
-{
-	struct storage *st = NULL;
-	struct stevedore *stv;
-	unsigned fail;
-
-	/*
-	 * Always use the stevedore which allocated the object in order to
-	 * keep an object inside the same stevedore.
-	 */
-	CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
-	stv = vc->body->stevedore;
-	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
-
-	if (size > cache_param->fetch_maxchunksize)
-		size = cache_param->fetch_maxchunksize;
-
-	assert(size <= UINT_MAX);	/* field limit in struct storage */
-
-	for (fail = 0; fail <= cache_param->nuke_limit; fail++) {
-		/* try to allocate from it */
-		AN(stv->alloc);
-		st = stv_alloc(stv, size);
-		if (st != NULL)
-			break;
-
-		/* no luck; try to free some space and keep trying */
-		if (fail < cache_param->nuke_limit &&
-		    EXP_NukeOne(vc->vsl, vc->stats, stv->lru) == -1)
-			break;
-	}
-	CHECK_OBJ_ORNULL(st, STORAGE_MAGIC);
-	return (st);
-}
-
-
 /*-------------------------------------------------------------------*
  * Structure used to transport internal knowledge from STV_NewObject()
  * to STV_MkObject().  Nobody else should mess with this struct.
@@ -367,17 +328,10 @@ STV_NewObject(struct busyobj *bo, const char *hint, unsigned wsl)
 /*-------------------------------------------------------------------*/
 
 struct storage *
-STV_alloc(const struct vfp_ctx *vc, size_t size)
-{
-
-	return (stv_alloc_obj(vc, size));
-}
-
-struct storage *
 STV_alloc_transient(size_t size)
 {
 
-	return (stv_alloc(stv_transient, size));
+	return (STV_alloc(stv_transient, size));
 }
 
 void



More information about the varnish-commit mailing list