[master] 4d461ea Also get struct storage out of VFP_GetStorage()

Poul-Henning Kamp phk at FreeBSD.org
Thu Aug 21 13:19:26 CEST 2014


commit 4d461eae3c6a6fc6fc56ab135481288ab3139722
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Aug 21 11:19:14 2014 +0000

    Also get struct storage out of VFP_GetStorage()

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index f5fc9e3..27a0e1b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1061,8 +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);
+int ObjGetSpace(struct objcore *, struct vsl_log *vsl,
+    struct dstat *, ssize_t *sz, uint8_t **ptr);
 void ObjExtend(struct objcore *, struct dstat *, ssize_t l);
 void ObjTrimStore(struct objcore *, struct dstat *);
 unsigned ObjGetXID(struct objcore *, struct dstat *);
diff --git a/bin/varnishd/cache/cache_fetch_proc.c b/bin/varnishd/cache/cache_fetch_proc.c
index 08c67c6..0083510 100644
--- a/bin/varnishd/cache/cache_fetch_proc.c
+++ b/bin/varnishd/cache/cache_fetch_proc.c
@@ -77,11 +77,11 @@ enum vfp_status
 VFP_GetStorage(struct vfp_ctx *vc, ssize_t *sz, uint8_t **ptr)
 {
 	ssize_t l;
-	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(vc, VFP_CTX_MAGIC);
 	CHECK_OBJ_NOTNULL(vc->bo, BUSYOBJ_MAGIC);
 	AN(sz);
+	assert(*sz >= 0);
 	AN(ptr);
 
 	AN(vc->stats);
@@ -90,15 +90,13 @@ VFP_GetStorage(struct vfp_ctx *vc, ssize_t *sz, uint8_t **ptr)
 		l = *sz;
 	if (l == 0)
 		l = cache_param->fetch_chunksize;
-	st = ObjGetSpace(vc->oc, vc->vsl, vc->stats, l);
-	if (st == NULL) {
+	*sz = l;
+	if (!ObjGetSpace(vc->oc, vc->vsl, vc->stats, sz, ptr)) {
 		*sz = 0;
 		*ptr = NULL;
 		return (VFP_Error(vc, "Could not get storage"));
 	}
-	*sz = st->space - st->len;
 	assert(*sz > 0);
-	*ptr = st->ptr + st->len;
 	AN(*ptr);
 	return (VFP_OK);
 }
@@ -219,6 +217,7 @@ VFP_Fetch_Body(struct busyobj *bo)
 		}
 		AZ(bo->vfc->failed);
 		l = est;
+		assert(l >= 0);
 		if (VFP_GetStorage(bo->vfc, &l, &ptr) != VFP_OK) {
 			bo->doclose = SC_RX_BODY;
 			break;
@@ -228,8 +227,10 @@ VFP_Fetch_Body(struct busyobj *bo)
 		vfps = VFP_Suck(bo->vfc, ptr, &l);
 		if (l > 0 && vfps != VFP_ERROR) {
 			VBO_extend(bo, l);
-			if (est > 0)
+			if (est >= l)
 				est -= l;
+			else
+				est = 0;
 		}
 	} while (vfps == VFP_OK);
 
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index edf16f3..a1b2296 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -213,25 +213,32 @@ objallocwithnuke(struct stevedore *stv, struct vsl_log *vsl, struct dstat *ds,
 /*--------------------------------------------------------------------
  */
 
-struct storage *
+int
 ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
-    ssize_t sz)
+    ssize_t *sz, uint8_t **ptr)
 {
 	struct object *o;
 	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
+	AN(sz);
+	AN(ptr);
+	assert(*sz > 0);
 	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);
+	if (st != NULL && st->len < st->space) {
+		*sz = st->space - st->len;
+		*ptr = st->ptr + st->len;
+		assert (*sz > 0);
+		return (1);
+	}
 
-	st = objallocwithnuke(o->body->stevedore, vsl, ds, sz);
+	st = objallocwithnuke(o->body->stevedore, vsl, ds, *sz);
 	if (st == NULL)
-		return (st);
+		return (0);
 
 	if (oc->busyobj != NULL) {
 		CHECK_OBJ_NOTNULL(oc->busyobj, BUSYOBJ_MAGIC);
@@ -241,7 +248,10 @@ ObjGetSpace(struct objcore *oc, struct vsl_log *vsl, struct dstat *ds,
 	} else {
 		VTAILQ_INSERT_TAIL(&o->body->list, st, list);
 	}
-	return (st);
+	*sz = st->space - st->len;
+	assert (*sz > 0);
+	*ptr = st->ptr + st->len;
+	return (1);
 }
 
 /*--------------------------------------------------------------------



More information about the varnish-commit mailing list