[experimental-ims] a2a2717 Move more gzip buffers off th wrk->stack and into malloc.

Geoff Simmons geoff at varnish-cache.org
Tue Feb 14 17:49:18 CET 2012


commit a2a2717f6c8e5a185151343c70532a9615039583
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Feb 7 10:27:32 2012 +0000

    Move more gzip buffers off th wrk->stack and into malloc.

diff --git a/bin/varnishd/cache/cache_esi_fetch.c b/bin/varnishd/cache/cache_esi_fetch.c
index d2f4c01..6b2d271 100644
--- a/bin/varnishd/cache/cache_esi_fetch.c
+++ b/bin/varnishd/cache/cache_esi_fetch.c
@@ -37,6 +37,24 @@
 #include "cache_esi.h"
 
 /*---------------------------------------------------------------------
+ */
+
+struct vef_priv {
+	unsigned		magic;
+#define VEF_MAGIC		0xf104b51f
+	struct vgz		*vgz;
+
+	char			*bufp;
+	ssize_t			tot;
+	int			error;
+	char			pending[20];
+	ssize_t			npend;
+
+	char			*ibuf;
+	ssize_t			ibuf_sz;
+};
+
+/*---------------------------------------------------------------------
  * Read some bytes.
  *
  * If the esi_syntax&8 bit is set, we read only a couple of bytes at
@@ -64,12 +82,14 @@ vef_read(struct worker *wrk, struct http_conn *htc, void *buf, ssize_t buflen,
  */
 
 static int
-vfp_esi_bytes_uu(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
+vfp_esi_bytes_uu(struct worker *wrk, const struct vef_priv *vef,
+    struct http_conn *htc, ssize_t bytes)
 {
 	ssize_t wl;
 	struct storage *st;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
 
 	while (bytes > 0) {
 		st = FetchStorage(wrk, 0);
@@ -92,24 +112,25 @@ vfp_esi_bytes_uu(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
  */
 
 static int
-vfp_esi_bytes_gu(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
+vfp_esi_bytes_gu(struct worker *wrk, const struct vef_priv *vef,
+    struct http_conn *htc, ssize_t bytes)
 {
 	struct vgz *vg;
 	ssize_t wl;
-	uint8_t	ibuf[cache_param->gzip_stack_buffer];
 	int i;
 	size_t dl;
 	const void *dp;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
 	vg = wrk->busyobj->vgz_rx;
 
 	while (bytes > 0) {
 		if (VGZ_IbufEmpty(vg) && bytes > 0) {
-			wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes);
+			wl = vef_read(wrk, htc, vef->ibuf, vef->ibuf_sz, bytes);
 			if (wl <= 0)
 				return (wl);
-			VGZ_Ibuf(vg, ibuf, wl);
+			VGZ_Ibuf(vg, vef->ibuf, wl);
 			bytes -= wl;
 		}
 		if (VGZ_ObufStorage(wrk, vg))
@@ -123,21 +144,6 @@ vfp_esi_bytes_gu(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
 }
 
 /*---------------------------------------------------------------------
- */
-
-struct vef_priv {
-	unsigned		magic;
-#define VEF_MAGIC		0xf104b51f
-	struct vgz		*vgz;
-
-	char			*bufp;
-	ssize_t			tot;
-	int			error;
-	char			pending[20];
-	ssize_t			npend;
-};
-
-/*---------------------------------------------------------------------
  * We receive a [un]gzip'ed object, and want to store it gzip'ed.
  */
 
@@ -205,31 +211,29 @@ vfp_vep_callback(struct worker *wrk, ssize_t l, enum vgz_flag flg)
 }
 
 static int
-vfp_esi_bytes_ug(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
+vfp_esi_bytes_ug(struct worker *wrk, struct vef_priv *vef,
+    struct http_conn *htc, ssize_t bytes)
 {
 	ssize_t wl;
-	char ibuf[cache_param->gzip_stack_buffer];
-	struct vef_priv *vef;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
-	vef = wrk->busyobj->vef_priv;
 	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 
 	while (bytes > 0) {
-		wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes);
+		wl = vef_read(wrk, htc, vef->ibuf, vef->ibuf_sz, bytes);
 		if (wl <= 0)
 			return (wl);
 		bytes -= wl;
-		vef->bufp = ibuf;
-		VEP_Parse(wrk, ibuf, wl);
-		assert(vef->bufp >= ibuf && vef->bufp <= ibuf + wl);
+		vef->bufp = vef->ibuf;
+		VEP_Parse(wrk, vef->ibuf, wl);
+		assert(vef->bufp >= vef->ibuf && vef->bufp <= vef->ibuf + wl);
 		if (vef->error) {
 			errno = vef->error;
 			return (-1);
 		}
-		if (vef->bufp < ibuf + wl) {
-			wl = (ibuf + wl) - vef->bufp;
+		if (vef->bufp < vef->ibuf + wl) {
+			wl = (vef->ibuf + wl) - vef->bufp;
 			assert(wl + vef->npend < sizeof vef->pending);
 			memmove(vef->pending + vef->npend, vef->bufp, wl);
 			vef->npend += wl;
@@ -243,31 +247,28 @@ vfp_esi_bytes_ug(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
  */
 
 static int
-vfp_esi_bytes_gg(struct worker *wrk, struct http_conn *htc, size_t bytes)
+vfp_esi_bytes_gg(struct worker *wrk, struct vef_priv *vef,
+    struct http_conn *htc, size_t bytes)
 {
 	ssize_t wl;
-	char ibuf[cache_param->gzip_stack_buffer];
 	char ibuf2[cache_param->gzip_stack_buffer];
-	struct vef_priv *vef;
 	size_t dl;
 	const void *dp;
 	int i;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
-	vef = wrk->busyobj->vef_priv;
 	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
-	assert(sizeof ibuf >= 1024);
+	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 	ibuf2[0] = 0; /* For Flexelint */
 
 	while (bytes > 0) {
-		wl = vef_read(wrk, htc, ibuf, sizeof ibuf, bytes);
+		wl = vef_read(wrk, htc, vef->ibuf, vef->ibuf_sz, bytes);
 		if (wl <= 0)
 			return (wl);
 		bytes -= wl;
 
-		vef->bufp = ibuf;
-		VGZ_Ibuf(wrk->busyobj->vgz_rx, ibuf, wl);
+		vef->bufp = vef->ibuf;
+		VGZ_Ibuf(wrk->busyobj->vgz_rx, vef->ibuf, wl);
 		do {
 			VGZ_Obuf(wrk->busyobj->vgz_rx, ibuf2, sizeof ibuf2);
 			i = VGZ_Gunzip(wrk->busyobj->vgz_rx, &dp, &dl);
@@ -306,30 +307,32 @@ vfp_esi_begin(struct worker *wrk, size_t estimate)
 	bo = wrk->busyobj;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
+	ALLOC_OBJ(vef, VEF_MAGIC);
+	XXXAN(vef);
+	AZ(bo->vef_priv);
+	bo->vef_priv = vef;
+
 	AZ(bo->vgz_rx);
 	if (bo->is_gzip && bo->do_gunzip) {
 		bo->vgz_rx = VGZ_NewUngzip(wrk, "U F E");
 		VEP_Init(wrk, NULL);
+		vef->ibuf_sz = cache_param->gzip_stack_buffer;
 	} else if (bo->is_gunzip && bo->do_gzip) {
-		ALLOC_OBJ(vef, VEF_MAGIC);
-		AN(vef);
 		vef->vgz = VGZ_NewGzip(wrk, "G F E");
-		AZ(bo->vef_priv);
-		bo->vef_priv = vef;
 		VEP_Init(wrk, vfp_vep_callback);
+		vef->ibuf_sz = cache_param->gzip_stack_buffer;
 	} else if (bo->is_gzip) {
 		bo->vgz_rx = VGZ_NewUngzip(wrk, "U F E");
-		ALLOC_OBJ(vef, VEF_MAGIC);
-		AN(vef);
 		vef->vgz = VGZ_NewGzip(wrk, "G F E");
-		AZ(bo->vef_priv);
-		bo->vef_priv = vef;
 		VEP_Init(wrk, vfp_vep_callback);
+		vef->ibuf_sz = cache_param->gzip_stack_buffer;
 	} else {
-		AZ(bo->vef_priv);
 		VEP_Init(wrk, NULL);
 	}
-
+	if (vef->ibuf_sz > 0) {
+		vef->ibuf = calloc(1L, vef->ibuf_sz);
+		XXXAN(vef->ibuf);
+	}
 	AN(bo->vep);
 }
 
@@ -337,23 +340,26 @@ static int __match_proto__()
 vfp_esi_bytes(struct worker *wrk, struct http_conn *htc, ssize_t bytes)
 {
 	struct busyobj *bo;
+	struct vef_priv *vef;
 	int i;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	bo = wrk->busyobj;
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+	vef = bo->vef_priv;
+	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
 
 	AZ(bo->fetch_failed);
 	AN(bo->vep);
 	assert(&bo->htc == htc);
 	if (bo->is_gzip && bo->do_gunzip)
-		i = vfp_esi_bytes_gu(wrk, htc, bytes);
+		i = vfp_esi_bytes_gu(wrk, vef, htc, bytes);
 	else if (bo->is_gunzip && bo->do_gzip)
-		i = vfp_esi_bytes_ug(wrk, htc, bytes);
+		i = vfp_esi_bytes_ug(wrk, vef, htc, bytes);
 	else if (bo->is_gzip)
-		i = vfp_esi_bytes_gg(wrk, htc, bytes);
+		i = vfp_esi_bytes_gg(wrk, vef, htc, bytes);
 	else
-		i = vfp_esi_bytes_uu(wrk, htc, bytes);
+		i = vfp_esi_bytes_uu(wrk, vef, htc, bytes);
 	AN(bo->vep);
 	return (i);
 }
@@ -398,15 +404,17 @@ vfp_esi_end(struct worker *wrk)
 	}
 
 	vef = bo->vef_priv;
-	if (vef != NULL) {
-		CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
-		bo->vef_priv = NULL;
+	bo->vef_priv = NULL;
+	CHECK_OBJ_NOTNULL(vef, VEF_MAGIC);
+	if (vef->vgz != NULL) {
 		VGZ_UpdateObj(vef->vgz, bo->fetch_obj);
 		if (VGZ_Destroy(&vef->vgz,  -1) != VGZ_END)
 			retval = FetchError(wrk,
 			    "ESI+Gzip Failed at the very end");
-		FREE_OBJ(vef);
 	}
+	if (vef->ibuf != NULL)
+		free(vef->ibuf);
+	FREE_OBJ(vef);
 	return (retval);
 }
 



More information about the varnish-commit mailing list