[master] ba29375 Create a procedure to centralize the housekeeping of feeding a VGZ instance into sp->obj.

Poul-Henning Kamp phk at project.varnish-software.com
Fri Jan 21 23:26:34 CET 2011


commit ba293755d0b3b62dad1629f458a6ffbc661d380a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Jan 21 22:25:02 2011 +0000

    Create a procedure to centralize the housekeeping of feeding a VGZ
    instance into sp->obj.

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 9ee361d..9cacf45 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -633,6 +633,7 @@ struct vgz *VGZ_NewGzip(const struct sess *sp, struct ws *tmp);
 void VGZ_Ibuf(struct vgz *, const void *, ssize_t len);
 int VGZ_IbufEmpty(struct vgz *vg);
 void VGZ_Obuf(struct vgz *, const void *, ssize_t len);
+int VGZ_ObufStorage(const struct sess *sp, struct vgz *vg);
 int VGZ_Gzip(struct vgz *, const void **, size_t *len, enum vgz_flag);
 int VGZ_Gunzip(struct vgz *, const void **, size_t *len);
 void VGZ_Destroy(struct vgz **);
diff --git a/bin/varnishd/cache_esi_fetch.c b/bin/varnishd/cache_esi_fetch.c
index 68643d2..e2ebc1d 100644
--- a/bin/varnishd/cache_esi_fetch.c
+++ b/bin/varnishd/cache_esi_fetch.c
@@ -103,7 +103,6 @@ vfp_esi_bytes_gu(struct sess *sp, struct http_conn *htc, size_t bytes)
 {
 	struct vgz *vg;
 	ssize_t l, w;
-	struct storage *st;
 	uint8_t	ibuf[1024 * params->gzip_stack_buffer];
 	int i;
 	size_t dl;
@@ -113,18 +112,6 @@ vfp_esi_bytes_gu(struct sess *sp, struct http_conn *htc, size_t bytes)
 	vg = sp->wrk->vgz_rx;
 
 	while (bytes > 0) {
-		if (sp->wrk->storage == NULL) {
-			l = params->fetch_chunksize * 1024LL;
-			sp->wrk->storage = STV_alloc(sp, l);
-		}
-		if (sp->wrk->storage == NULL) {
-			errno = ENOMEM;
-			return (-1);
-		}
-		st = sp->wrk->storage;
-
-		VGZ_Obuf(vg, st->ptr + st->len, st->space - st->len);
-
 		if (VGZ_IbufEmpty(vg) && bytes > 0) {
 			l = sizeof ibuf;
 			if (l > bytes)
@@ -135,16 +122,11 @@ vfp_esi_bytes_gu(struct sess *sp, struct http_conn *htc, size_t bytes)
 			VGZ_Ibuf(vg, ibuf, w);
 			bytes -= w;
 		}
+		if (VGZ_ObufStorage(sp, vg))
+			return (-1);
 		i = VGZ_Gunzip(vg, &dp, &dl);
 		VEP_parse(sp, dp, dl);
-		st->len += dl;
 		sp->obj->len += dl;
-		if (st->len == st->space) {
-			VTAILQ_INSERT_TAIL(&sp->obj->store,
-			    sp->wrk->storage, list);
-			sp->wrk->storage = NULL;
-			st = NULL;
-		}
 	}
 	return (1);
 }
@@ -172,11 +154,9 @@ static ssize_t
 vfp_vep_callback(const struct sess *sp, ssize_t l, enum vgz_flag flg)
 {
 	struct vef_priv *vef;
-	struct storage *st;
 	size_t dl;
 	const void *dp;
 	int i;
-	char *p;
 
 printf("ZCB(%jd, %d)\n", l, flg);
 
@@ -192,29 +172,15 @@ printf("ZCB(%jd, %d)\n", l, flg);
 
 	VGZ_Ibuf(vef->vgz, vef->bufp, l);
 	do {
-		if (sp->wrk->storage == NULL) {
-			l = params->fetch_chunksize * 1024LL;
-			sp->wrk->storage = STV_alloc(sp, l);
-		}
-		if (sp->wrk->storage == NULL) {
+		if (VGZ_ObufStorage(sp, vef->vgz)) {
 			vef->error = ENOMEM;
 			vef->tot += l;
 			return (vef->tot);
 		}
-
-		st = sp->wrk->storage;
-		VGZ_Obuf(vef->vgz, st->ptr + st->len, st->space - st->len);
-		p = (void*)(st->ptr + st->len);
 		i = VGZ_Gzip(vef->vgz, &dp, &dl, flg);
 printf("GZI = %d %jd\n", i, dl);
 		vef->tot += dl;
-		st->len += dl;
-		if (st->len == st->space) {
-			VTAILQ_INSERT_TAIL(&sp->obj->store,
-			    sp->wrk->storage, list);
-			sp->wrk->storage = NULL;
-			st = NULL;
-		}
+		sp->obj->len += dl;
 	} while (!VGZ_IbufEmpty(vef->vgz));
 	vef->bufp += l;
 if (flg == VGZ_FINISH)
@@ -251,15 +217,13 @@ vfp_esi_bytes_ug(struct sess *sp, struct http_conn *htc, size_t bytes)
 		if (l > bytes)
 			l = bytes;
 		w = HTC_Read(htc, ibuf, l);
-		if (w <= 0) {
-printf("RT %jd\n", w);
+		if (w <= 0)
 			return (w);
-}
 		bytes -= w;
 		vef->bufp = ibuf;
 		VEP_parse(sp, ibuf, l);
 		if (vef->error) {
-			// errno = vef->error;
+			errno = vef->error;
 			return (-1);
 		}
 	}
diff --git a/bin/varnishd/cache_fetch.c b/bin/varnishd/cache_fetch.c
index 8f113f2..d28dd5d 100644
--- a/bin/varnishd/cache_fetch.c
+++ b/bin/varnishd/cache_fetch.c
@@ -567,7 +567,7 @@ FetchBody(struct sess *sp)
 
 	{
 	/* Sanity check fetch methods accounting */
-		unsigned uu;
+		ssize_t uu;
 
 		uu = 0;
 		VTAILQ_FOREACH(st, &sp->obj->store, list)
diff --git a/bin/varnishd/cache_gzip.c b/bin/varnishd/cache_gzip.c
index e852ba3..8d0980c 100644
--- a/bin/varnishd/cache_gzip.c
+++ b/bin/varnishd/cache_gzip.c
@@ -82,7 +82,7 @@ struct vgz {
 	struct ws		*tmp;
 	char			*tmp_snapshot;
 
-	void			*before;
+	struct storage		*obuf;
 
 	z_stream		vz;
 };
@@ -221,12 +221,45 @@ VGZ_Obuf(struct vgz *vg, const void *ptr, ssize_t len)
 	vg->vz.avail_out = len;
 }
 
+/*--------------------------------------------------------------------
+ * Keep the outbuffer supplied with storage and file it under the
+ * sp->obj as it fills.
+ */
+
+int
+VGZ_ObufStorage(const struct sess *sp, struct vgz *vg)
+{
+	struct storage *st;
+
+	st = sp->wrk->storage;
+	if (st != NULL && st->len == st->space) {
+		VTAILQ_INSERT_TAIL(&sp->obj->store, st, list);
+		sp->wrk->storage = NULL;
+		st = NULL;
+		vg->obuf = NULL;
+	}
+	if (st == NULL) { 
+		st = STV_alloc(sp, params->fetch_chunksize * 1024LL);
+		if (st == NULL) {
+			errno = ENOMEM;
+			return (-1);
+		}
+		sp->wrk->storage = st;
+	}
+	vg->obuf = st;
+	VGZ_Obuf(vg, st->ptr + st->len, st->space - st->len);
+
+	return (0);
+}
+
 /*--------------------------------------------------------------------*/
 
 int
 VGZ_Gunzip(struct vgz *vg, const void **pptr, size_t *plen)
 {
 	int i;
+	ssize_t l;
+	const uint8_t *before;
 
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 
@@ -234,11 +267,14 @@ VGZ_Gunzip(struct vgz *vg, const void **pptr, size_t *plen)
 	*plen = 0;
 	AN(vg->vz.next_out);
 	AN(vg->vz.avail_out);
-	vg->before = vg->vz.next_out;
+	before = vg->vz.next_out;
 	i = inflate(&vg->vz, 0);
 	if (i == Z_OK || i == Z_STREAM_END) {
-		*pptr = vg->before;
-		*plen = (const uint8_t *)vg->vz.next_out - (const uint8_t*)vg->before;
+		*pptr = before;
+		l = (const uint8_t *)vg->vz.next_out - before;
+		*plen = l;
+		if (vg->obuf != NULL)
+			vg->obuf->len += l;
 	}
 	if (i == Z_OK)
 		return (0);
@@ -256,6 +292,8 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, size_t *plen, enum vgz_flag flags)
 {
 	int i;
 	int zflg;
+	ssize_t l;
+	const uint8_t *before;
 
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 
@@ -263,7 +301,7 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, size_t *plen, enum vgz_flag flags)
 	*plen = 0;
 	AN(vg->vz.next_out);
 	AN(vg->vz.avail_out);
-	vg->before = vg->vz.next_out;
+	before = vg->vz.next_out;
 	switch(flags) {
 	case VGZ_NORMAL:	zflg = Z_NO_FLUSH; break;
 	case VGZ_ALIGN:		zflg = Z_SYNC_FLUSH; break;
@@ -273,8 +311,11 @@ VGZ_Gzip(struct vgz *vg, const void **pptr, size_t *plen, enum vgz_flag flags)
 	}
 	i = deflate(&vg->vz, zflg);
 	if (i == Z_OK || i == Z_STREAM_END) {
-		*pptr = vg->before;
-		*plen = (const uint8_t *)vg->vz.next_out - (const uint8_t*)vg->before;
+		*pptr = before;
+		l = (const uint8_t *)vg->vz.next_out - before;
+		*plen = l;
+		if (vg->obuf != NULL)
+			vg->obuf->len += l;
 	}
 	if (i == Z_OK)
 		return (0);
@@ -313,7 +354,6 @@ static int __match_proto__()
 vfp_gunzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 {
 	struct vgz *vg;
-	struct storage *st;
 	ssize_t l, w;
 	int i = -100;
 	uint8_t	ibuf[1024 * params->gzip_stack_buffer];
@@ -324,17 +364,6 @@ vfp_gunzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 	AZ(vg->vz.avail_in);
 	while (bytes > 0 || vg->vz.avail_in > 0) {
-		if (sp->wrk->storage == NULL)
-			sp->wrk->storage = STV_alloc(sp,
-			    params->fetch_chunksize * 1024LL);
-		if (sp->wrk->storage == NULL) {
-			errno = ENOMEM;
-			return (-1);
-		}
-		st = sp->wrk->storage;
-
-		VGZ_Obuf(vg, st->ptr + st->len, st->space - st->len);
-
 		if (vg->vz.avail_in == 0 && bytes > 0) {
 			l = sizeof ibuf;
 			if (l > bytes)
@@ -346,15 +375,11 @@ vfp_gunzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 			bytes -= w;
 		}
 
+		if (VGZ_ObufStorage(sp, vg))
+			return (-1);
 		i = VGZ_Gunzip(vg, &dp, &dl);
 		assert(i == Z_OK || i == Z_STREAM_END);
-		st->len += dl;
-		if (st->len == st->space) {
-			VTAILQ_INSERT_TAIL(&sp->obj->store,
-			    sp->wrk->storage, list);
-			sp->obj->len += st->len;
-			sp->wrk->storage = NULL;
-		}
+		sp->obj->len += dl;
 	}
 	if (i == Z_STREAM_END)
 		return (1);
@@ -382,7 +407,6 @@ vfp_gunzip_end(struct sess *sp)
 	}
 	if (st->len < st->space)
 		STV_trim(st, st->len);
-	sp->obj->len += st->len;
 	VTAILQ_INSERT_TAIL(&sp->obj->store, st, list);
 	return (0);
 }
@@ -412,7 +436,6 @@ static int __match_proto__()
 vfp_gzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 {
 	struct vgz *vg;
-	struct storage *st;
 	ssize_t l, w;
 	int i = -100;
 	uint8_t ibuf[1024 * params->gzip_stack_buffer];
@@ -423,17 +446,6 @@ vfp_gzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 	AZ(vg->vz.avail_in);
 	while (bytes > 0 || !VGZ_IbufEmpty(vg)) {
-		if (sp->wrk->storage == NULL)
-			sp->wrk->storage = STV_alloc(sp,
-			    params->fetch_chunksize * 1024LL);
-		if (sp->wrk->storage == NULL) {
-			errno = ENOMEM;
-			return (-1);
-		}
-		st = sp->wrk->storage;
-
-		VGZ_Obuf(vg, st->ptr + st->len, st->space - st->len);
-
 		if (VGZ_IbufEmpty(vg) && bytes > 0) {
 			l = sizeof ibuf;
 			if (l > bytes)
@@ -444,16 +456,11 @@ vfp_gzip_bytes(struct sess *sp, struct http_conn *htc, size_t bytes)
 			VGZ_Ibuf(vg, ibuf, w);
 			bytes -= w;
 		}
-
+		if (VGZ_ObufStorage(sp, vg))
+			return (-1);
 		i = VGZ_Gzip(vg, &dp, &dl, VGZ_NORMAL);
 		assert(i == Z_OK);
-		st->len += dl;
 		sp->obj->len += dl;
-		if (st->len == st->space) {
-			VTAILQ_INSERT_TAIL(&sp->obj->store,
-			    sp->wrk->storage, list);
-			sp->wrk->storage = NULL;
-		}
 	}
 	return (1);
 }
@@ -462,33 +469,19 @@ static int __match_proto__()
 vfp_gzip_end(struct sess *sp)
 {
 	struct vgz *vg;
-	struct storage *st;
 	size_t dl;
 	const void *dp;
 	int i;
+	struct storage *st;
 
 	vg = sp->wrk->vgz_rx;
 	CHECK_OBJ_NOTNULL(vg, VGZ_MAGIC);
 	do {
-		if (sp->wrk->storage == NULL)
-			sp->wrk->storage = STV_alloc(sp,
-			    params->fetch_chunksize * 1024LL);
-		if (sp->wrk->storage == NULL) {
-			errno = ENOMEM;
-			return (-1);
-		}
-		st = sp->wrk->storage;
-
 		VGZ_Ibuf(vg, "", 0);
-		VGZ_Obuf(vg, st->ptr + st->len, st->space - st->len);
+		if (VGZ_ObufStorage(sp, vg))
+			return (-1);
 		i = VGZ_Gzip(vg, &dp, &dl, VGZ_FINISH);
-		st->len += dl;
 		sp->obj->len += dl;
-		if (st->len == st->space) {
-			VTAILQ_INSERT_TAIL(&sp->obj->store,
-			    sp->wrk->storage, list);
-			sp->wrk->storage = NULL;
-		}
 	} while (i != Z_STREAM_END);
 	VGZ_Destroy(&vg);
 



More information about the varnish-commit mailing list