[master] 4ccf3b5 Remove the ESI/gzip CRC fields from struct req, and pass them as priv's inside ESI's delivery code.

Poul-Henning Kamp phk at FreeBSD.org
Thu May 14 22:43:48 CEST 2015


commit 4ccf3b5ba7f834beccd708627970aa9fab0d33cb
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu May 14 20:43:16 2015 +0000

    Remove the ESI/gzip CRC fields from struct req, and pass them
    as priv's inside ESI's delivery code.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 17f59dd..f9e5326 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -595,10 +595,6 @@ struct req {
 	struct objcore		*objcore;
 	struct objcore		*stale_oc;
 
-	/* ESI delivery stuff */
-	ssize_t			l_crc;
-	uint32_t		crc;
-
 	/* Delivery mode */
 	unsigned		res_mode;
 #define RES_LEN			(1<<1)
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index 02c992f..5bb360a 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -58,6 +58,10 @@ struct ecx {
 	int		state;
 	ssize_t		l;
 	int		isgzip;
+
+	struct req	*preq;
+	ssize_t		l_crc;
+	uint32_t	crc;
 };
 
 /*--------------------------------------------------------------------*/
@@ -145,7 +149,7 @@ ved_include(struct req *preq, const char *src, const char *host,
 	INIT_OBJ(&xp, TRANSPORT_MAGIC);
 	xp.deliver = VED_Deliver;
 	req->transport = &xp;
-	req->transport_priv = preq;
+	req->transport_priv = ecx;
 
 	THR_SetRequest(req);
 
@@ -172,12 +176,6 @@ ved_include(struct req *preq, const char *src, const char *host,
 	preq->vcl = req->vcl;
 	req->vcl = NULL;
 
-	if (ecx->isgzip && req->l_crc) {
-		preq->crc = crc32_combine(
-		    preq->crc, req->crc, req->l_crc);
-		preq->l_crc += req->l_crc;
-	}
-
 	req->wrk = NULL;
 
 	THR_SetRequest(preq);
@@ -237,6 +235,7 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
 		AZ(*priv);
 		ALLOC_OBJ(ecx, ECX_MAGIC);
 		AN(ecx);
+		ecx->preq = req;
 		*priv = ecx;
 		return (0);
 	}
@@ -273,9 +272,9 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
 					/* Send out the gzip header */
 					retval = VDP_bytes(req, VDP_NULL,
 					    gzip_hdr, 10);
-					req->l_crc = 0;
 					req->gzip_resp = 1;
-					req->crc = crc32(0L, Z_NULL, 0);
+					ecx->l_crc = 0;
+					ecx->crc = crc32(0L, Z_NULL, 0);
 				}
 			}
 			ecx->state = 1;
@@ -299,9 +298,9 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
 					icrc = vbe32dec(ecx->p);
 					ecx->p += 4;
 					if (req->gzip_resp) {
-						req->crc = crc32_combine(
-						    req->crc, icrc, l);
-						req->l_crc += l;
+						ecx->crc = crc32_combine(
+						    ecx->crc, icrc, l);
+						ecx->l_crc += l;
 					}
 				}
 				ecx->state = 3;
@@ -349,10 +348,10 @@ VDP_ESI(struct req *req, enum vdp_action act, void **priv,
 				tailbuf[4] = 0xff;
 
 				/* Emit CRC32 */
-				vle32enc(tailbuf + 5, req->crc);
+				vle32enc(tailbuf + 5, ecx->crc);
 
 				/* MOD(2^32) length */
-				vle32enc(tailbuf + 9, req->l_crc);
+				vle32enc(tailbuf + 9, ecx->l_crc);
 
 				(void)VDP_bytes(req, VDP_NULL, tailbuf, 13);
 			}
@@ -419,13 +418,28 @@ ved_pretend_gzip(struct req *req, enum vdp_action act, void **priv,
 	uint8_t buf1[5], buf2[5];
 	const uint8_t *p;
 	uint16_t lx;
+	struct ecx *ecx;
 
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+	CAST_OBJ_NOTNULL(ecx, *priv, ECX_MAGIC);
+
 	(void)priv;
-	if (act == VDP_INIT || act == VDP_FINI)
+	if (act == VDP_INIT)
+		return (0);
+	if (act == VDP_FINI) {
+		*priv = NULL;
 		return (0);
+	}
+	if (l == 0)
+		return (VDP_bytes(req, act, pv, l));
+
 	p = pv;
 
+	if (ecx->isgzip) {
+		ecx->crc = crc32(ecx->crc, p, l);
+		ecx->l_crc += l;
+	}
+
 	lx = 65535;
 	buf1[0] = 0;
 	vle16enc(buf1 + 1, lx);
@@ -446,8 +460,6 @@ ved_pretend_gzip(struct req *req, enum vdp_action act, void **priv,
 		}
 		if (VDP_bytes(req, VDP_NULL, p, lx))
 			return (-1);
-		req->crc = crc32(req->crc, p, lx);
-		req->l_crc += lx;
 		l -= lx;
 		p += lx;
 	}
@@ -475,9 +487,11 @@ ved_stripgzip(struct req *req)
 	void *oi;
 	void *sp;
 	ssize_t sl, ll, dl;
+	struct ecx *ecx;
 
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+	CAST_OBJ_NOTNULL(ecx, req->transport_priv, ECX_MAGIC);
 
 	AN(ObjCheckFlag(req->wrk, req->objcore, OF_GZIPED));
 
@@ -645,8 +659,9 @@ ved_stripgzip(struct req *req)
 
 	icrc = vle32dec(tailbuf);
 	ilen = vle32dec(tailbuf + 4);
-	req->crc = crc32_combine(req->crc, icrc, ilen);
-	req->l_crc += ilen;
+
+	ecx->crc = crc32_combine(ecx->crc, icrc, ilen);
+	ecx->l_crc += ilen;
 }
 
 /*--------------------------------------------------------------------*/
@@ -675,18 +690,18 @@ static void __match_proto__(vtr_deliver_f)
 VED_Deliver(struct req *req, struct busyobj *bo)
 {
 	int i;
-	struct req *preq;
+	struct ecx *ecx;
 
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	CHECK_OBJ_ORNULL(bo, BUSYOBJ_MAGIC);
 	CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
 
-	CAST_OBJ_NOTNULL(preq, req->transport_priv, REQ_MAGIC);
+	CAST_OBJ_NOTNULL(ecx, req->transport_priv, ECX_MAGIC);
 
 	req->res_mode |= RES_ESI_CHILD;
 	i = ObjCheckFlag(req->wrk, req->objcore, OF_GZIPED);
 	if (req->gzip_resp && i && !(req->res_mode & RES_ESI)) {
-		VDP_push(req, ved_vdp_bytes, preq, 1);
+		VDP_push(req, ved_vdp_bytes, ecx->preq, 1);
 
 		if (bo != NULL)
 			VBO_waitstate(bo, BOS_FINISHED);
@@ -694,9 +709,9 @@ VED_Deliver(struct req *req, struct busyobj *bo)
 		(void)VDP_bytes(req, VDP_FLUSH, NULL, 0);
 	} else {
 		if (req->gzip_resp && !i)
-			VDP_push(req, ved_pretend_gzip, NULL, 1);
+			VDP_push(req, ved_pretend_gzip, ecx, 1);
 
-		VDP_push(req, ved_vdp_bytes, preq, 1);
+		VDP_push(req, ved_vdp_bytes, ecx->preq, 1);
 		(void)VDP_DeliverObj(req);
 	}
 	VDP_close(req);



More information about the varnish-commit mailing list