[experimental-ims] 8f85e38 Move request vary string from wrk to sess

Geoff Simmons geoff at varnish-cache.org
Fri Jul 8 11:47:47 CEST 2011


commit 8f85e380960fe09cff72c6e108789f247c08a065
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jun 22 10:39:47 2011 +0000

    Move request vary string from wrk to sess

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 22fa5ff..1d3db55 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -300,9 +300,6 @@ struct worker {
 
 	/* Lookup stuff */
 	struct SHA256Context	*sha256ctx;
-	uint8_t			*vary_b;
-	uint8_t			*vary_l;
-	uint8_t			*vary_e;
 
 	struct http_conn	htc[1];
 	struct ws		ws[1];
@@ -554,6 +551,11 @@ struct sess {
 
 	unsigned char		digest[DIGEST_LEN];
 
+	/* Built Vary string */
+	uint8_t			*vary_b;
+	uint8_t			*vary_l;
+	uint8_t			*vary_e;
+
 	struct http_conn	htc[1];
 
 	/* Timestamps, all on TIM_real() timescale */
@@ -884,7 +886,7 @@ void RES_StreamPoll(const struct sess *sp);
 
 /* cache_vary.c */
 struct vsb *VRY_Create(const struct sess *sp, const struct http *hp);
-int VRY_Match(const struct sess *sp, const uint8_t *vary);
+int VRY_Match(struct sess *sp, const uint8_t *vary);
 
 /* cache_vcl.c */
 void VCL_Init(void);
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index 5b55d58..23ad92f 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -1028,28 +1028,23 @@ cnt_lookup(struct sess *sp)
 	struct objcore *oc;
 	struct object *o;
 	struct objhead *oh;
-	struct worker *wrk;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
 	CHECK_OBJ_NOTNULL(sp->vcl, VCL_CONF_MAGIC);
 
-
-	wrk = sp->wrk;
-	AZ(wrk->vary_b);
-	AZ(wrk->vary_l);
-	AZ(wrk->vary_e);
-	(void)WS_Reserve(wrk->ws, 0);
-	wrk->vary_b = (void*)wrk->ws->f;
-	wrk->vary_e = (void*)wrk->ws->r;
-	wrk->vary_b[2] = '\0';
+	if (sp->hash_objhead == NULL) {
+		/* Not a waiting list return */
+		AZ(sp->vary_b);
+		AZ(sp->vary_l);
+		AZ(sp->vary_e);
+		(void)WS_Reserve(sp->ws, 0);
+		sp->vary_b = (void*)sp->ws->f;
+		sp->vary_e = (void*)sp->ws->r;
+		sp->vary_b[2] = '\0';
+	}
 
 	oc = HSH_Lookup(sp, &oh);
 
-	WS_Release(wrk->ws, 0);
-	wrk->vary_b = NULL;
-	wrk->vary_l = NULL;
-	wrk->vary_e = NULL;
-
 	if (oc == NULL) {
 		/*
 		 * We lost the session to a busy object, disembark the
@@ -1060,6 +1055,7 @@ cnt_lookup(struct sess *sp)
 		return (1);
 	}
 
+
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 
@@ -1067,6 +1063,14 @@ cnt_lookup(struct sess *sp)
 	if (oc->flags & OC_F_BUSY) {
 		sp->wrk->stats.cache_miss++;
 
+		if (sp->vary_l != NULL)
+			WS_ReleaseP(sp->ws, (void*)sp->vary_l);
+		else
+			WS_Release(sp->ws, 0);
+		sp->vary_b = NULL;
+		sp->vary_l = NULL;
+		sp->vary_e = NULL;
+
 		sp->objcore = oc;
 		sp->step = STP_MISS;
 		return (0);
@@ -1076,6 +1080,11 @@ cnt_lookup(struct sess *sp)
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	sp->obj = o;
 
+	WS_Release(sp->ws, 0);
+	sp->vary_b = NULL;
+	sp->vary_l = NULL;
+	sp->vary_e = NULL;
+
 	if (oc->flags & OC_F_PASS) {
 		sp->wrk->stats.cache_hitpass++;
 		WSP(sp, SLT_HitPass, "%u", sp->obj->xid);
diff --git a/bin/varnishd/cache_vary.c b/bin/varnishd/cache_vary.c
index 01816f6..89e1675 100644
--- a/bin/varnishd/cache_vary.c
+++ b/bin/varnishd/cache_vary.c
@@ -176,9 +176,9 @@ vry_cmp(const uint8_t * const *v1, uint8_t * const *v2)
 }
 
 int
-VRY_Match(const struct sess *sp, const uint8_t *vary)
+VRY_Match(struct sess *sp, const uint8_t *vary)
 {
-	uint8_t *vsp = sp->wrk->vary_b;
+	uint8_t *vsp = sp->vary_b;
 	char *h, *e;
 	unsigned lh, ln;
 	int i, retval = 1, oflo = 0;
@@ -204,8 +204,8 @@ VRY_Match(const struct sess *sp, const uint8_t *vary)
 
 			/* Length of the entire new vary entry */
 			ln = 2 + vary[2] + 2 + (lh == 0xffff ? 0 : lh);
-			if (vsp + ln >= sp->wrk->vary_e) {
-				vsp = sp->wrk->vary_b;
+			if (vsp + ln >= sp->vary_e) {
+				vsp = sp->vary_b;
 				oflo = 1;
 			}
 
@@ -213,7 +213,7 @@ VRY_Match(const struct sess *sp, const uint8_t *vary)
 			 * We MUST have space for one entry and the end marker
 			 * after it, which prevents old junk from confusing us
 			 */
-			assert(vsp + ln + 2 < sp->wrk->vary_e);
+			assert(vsp + ln + 2 < sp->vary_e);
 
 			vbe16enc(vsp, (uint16_t)lh);
 			memcpy(vsp + 2, vary + 2, vary[2] + 2);
@@ -231,19 +231,19 @@ VRY_Match(const struct sess *sp, const uint8_t *vary)
 		vsp += vry_len(vsp);
 		vary += vry_len(vary);
 	}
-	if (vsp + 3 > sp->wrk->vary_e)
+	if (vsp + 3 > sp->vary_e)
 		oflo = 1;
 
 	if (oflo) {
 		/* XXX: Should log this */
-		vsp = sp->wrk->vary_b;
+		vsp = sp->vary_b;
 	}
 	vsp[0] = 0xff;
 	vsp[1] = 0xff;
 	vsp[2] = 0;
 	if (oflo) 
-		sp->wrk->vary_l = NULL;
+		sp->vary_l = NULL;
 	else
-		sp->wrk->vary_l = vsp + 3;
+		sp->vary_l = vsp + 3;
 	return (retval);
 }



More information about the varnish-commit mailing list