[master] 71fe293 Push struct session entirely out of FetchBody().

Poul-Henning Kamp phk at varnish-cache.org
Mon Oct 24 16:40:53 CEST 2011


commit 71fe2939a4435a1c5765de17708ecb22b3ddd66e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Oct 24 14:39:45 2011 +0000

    Push struct session entirely out of FetchBody().
    
    This should make it possible to get a different worker thread to pull
    the body in from the backend, without cloning the session structure,
    with all the trouble that would cause.

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 85f5d5f..b92fd60 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -704,7 +704,7 @@ int EXP_NukeOne(struct worker *w, struct lru *lru);
 /* cache_fetch.c */
 struct storage *FetchStorage(struct worker *w, ssize_t sz);
 int FetchHdr(struct sess *sp);
-int FetchBody(const struct sess *sp, struct object *obj);
+int FetchBody(struct worker *w, struct object *obj);
 int FetchReqBody(struct sess *sp);
 void Fetch_Init(void);
 
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index 13d8083..418fbe9 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -846,7 +846,7 @@ cnt_fetchbody(struct sess *sp)
 	}
 
 	/* Use unmodified headers*/
-	i = FetchBody(sp, sp->obj);
+	i = FetchBody(sp->wrk, sp->obj);
 
 	sp->wrk->h_content_length = NULL;
 
@@ -910,7 +910,7 @@ cnt_streambody(struct sess *sp)
 
 	AssertObjCorePassOrBusy(sp->obj->objcore);
 
-	i = FetchBody(sp, sp->obj);
+	i = FetchBody(sp->wrk, sp->obj);
 
 	sp->wrk->h_content_length = NULL;
 
diff --git a/bin/varnishd/cache_fetch.c b/bin/varnishd/cache_fetch.c
index 1769d3a..acef94b 100644
--- a/bin/varnishd/cache_fetch.c
+++ b/bin/varnishd/cache_fetch.c
@@ -198,24 +198,24 @@ fetch_number(const char *nbr, int radix)
 /*--------------------------------------------------------------------*/
 
 static int
-fetch_straight(const struct sess *sp, struct http_conn *htc, const char *b)
+fetch_straight(struct worker *w, struct http_conn *htc, const char *b)
 {
 	int i;
 	ssize_t cl;
 
-	assert(sp->wrk->body_status == BS_LENGTH);
+	assert(w->body_status == BS_LENGTH);
 
 	cl = fetch_number(b, 10);
-	sp->wrk->vfp->begin(sp->wrk, cl > 0 ? cl : 0);
+	w->vfp->begin(w, cl > 0 ? cl : 0);
 	if (cl < 0) {
-		WSP(sp, SLT_FetchError, "straight length field bogus");
+		WSLB(w, SLT_FetchError, "straight length field bogus");
 		return (-1);
 	} else if (cl == 0)
 		return (0);
 
-	i = sp->wrk->vfp->bytes(sp->wrk, htc, cl);
+	i = w->vfp->bytes(w, htc, cl);
 	if (i <= 0) {
-		WSP(sp, SLT_FetchError, "straight read_error: %d %d (%s)",
+		WSLB(w, SLT_FetchError, "straight read_error: %d %d (%s)",
 		    i, errno, htc->error);
 		return (-1);
 	}
@@ -227,7 +227,7 @@ fetch_straight(const struct sess *sp, struct http_conn *htc, const char *b)
 
 #define CERR() do {						\
 		if (i != 1) {					\
-			WSP(sp, SLT_FetchError,			\
+			WSLB(w, SLT_FetchError,			\
 			    "chunked read_error: %d (%s)",	\
 			    errno, htc->error);			\
 			return (-1);				\
@@ -235,15 +235,15 @@ fetch_straight(const struct sess *sp, struct http_conn *htc, const char *b)
 	} while (0)
 
 static int
-fetch_chunked(const struct sess *sp, struct http_conn *htc)
+fetch_chunked(struct worker *w, struct http_conn *htc)
 {
 	int i;
 	char buf[20];		/* XXX: 20 is arbitrary */
 	unsigned u;
 	ssize_t cl;
 
-	sp->wrk->vfp->begin(sp->wrk, 0);
-	assert(sp->wrk->body_status == BS_CHUNKED);
+	w->vfp->begin(w, 0);
+	assert(w->body_status == BS_CHUNKED);
 	do {
 		/* Skip leading whitespace */
 		do {
@@ -262,7 +262,7 @@ fetch_chunked(const struct sess *sp, struct http_conn *htc)
 		}
 
 		if (u >= sizeof buf) {
-			WSP(sp, SLT_FetchError,	"chunked header too long");
+			WSLB(w, SLT_FetchError,	"chunked header too long");
 			return (-1);
 		}
 
@@ -273,17 +273,17 @@ fetch_chunked(const struct sess *sp, struct http_conn *htc)
 		}
 
 		if (buf[u] != '\n') {
-			WSP(sp, SLT_FetchError,	"chunked header char syntax");
+			WSLB(w, SLT_FetchError,	"chunked header char syntax");
 			return (-1);
 		}
 		buf[u] = '\0';
 
 		cl = fetch_number(buf, 16);
 		if (cl < 0) {
-			WSP(sp, SLT_FetchError,	"chunked header nbr syntax");
+			WSLB(w, SLT_FetchError,	"chunked header nbr syntax");
 			return (-1);
 		} else if (cl > 0) {
-			i = sp->wrk->vfp->bytes(sp->wrk, htc, cl);
+			i = w->vfp->bytes(w, htc, cl);
 			CERR();
 		}
 		i = HTC_Read(htc, buf, 1);
@@ -293,7 +293,7 @@ fetch_chunked(const struct sess *sp, struct http_conn *htc)
 			CERR();
 		}
 		if (buf[0] != '\n') {
-			WSP(sp, SLT_FetchError,	"chunked tail syntax");
+			WSLB(w, SLT_FetchError,	"chunked tail syntax");
 			return (-1);
 		}
 	} while (cl > 0);
@@ -305,15 +305,15 @@ fetch_chunked(const struct sess *sp, struct http_conn *htc)
 /*--------------------------------------------------------------------*/
 
 static int
-fetch_eof(const struct sess *sp, struct http_conn *htc)
+fetch_eof(struct worker *w, struct http_conn *htc)
 {
 	int i;
 
-	assert(sp->wrk->body_status == BS_EOF);
-	sp->wrk->vfp->begin(sp->wrk, 0);
-	i = sp->wrk->vfp->bytes(sp->wrk, htc, SSIZE_MAX);
+	assert(w->body_status == BS_EOF);
+	w->vfp->begin(w, 0);
+	i = w->vfp->bytes(w, htc, SSIZE_MAX);
 	if (i < 0) {
-		WSP(sp, SLT_FetchError, "eof read_error: %d (%s)",
+		WSLB(w, SLT_FetchError, "eof read_error: %d (%s)",
 		    errno, htc->error);
 		return (-1);
 	}
@@ -480,24 +480,21 @@ FetchHdr(struct sess *sp)
 /*--------------------------------------------------------------------*/
 
 int
-FetchBody(const struct sess *sp, struct object *obj)
+FetchBody(struct worker *w, struct object *obj)
 {
 	int cls;
 	struct storage *st;
-	struct worker *w;
 	int mklen;
 
-	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
-	CHECK_OBJ_NOTNULL(sp->wrk, WORKER_MAGIC);
-	w = sp->wrk;
+	CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
 	AZ(w->fetch_obj);
+	CHECK_OBJ_NOTNULL(w->vbc, VBC_MAGIC);
 	CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(obj->http, HTTP_MAGIC);
 
 	if (w->vfp == NULL)
 		w->vfp = &vfp_nop;
 
-	AN(sp->director);
 	AssertObjCorePassOrBusy(obj->objcore);
 
 	AZ(w->vgz_rx);
@@ -515,20 +512,20 @@ FetchBody(const struct sess *sp, struct object *obj)
 		mklen = 1;
 		break;
 	case BS_LENGTH:
-		cls = fetch_straight(sp, w->htc,
+		cls = fetch_straight(w, w->htc,
 		    w->h_content_length);
 		mklen = 1;
-		XXXAZ(w->vfp->end(sp->wrk));
+		XXXAZ(w->vfp->end(w));
 		break;
 	case BS_CHUNKED:
-		cls = fetch_chunked(sp, w->htc);
+		cls = fetch_chunked(w, w->htc);
 		mklen = 1;
-		XXXAZ(w->vfp->end(sp->wrk));
+		XXXAZ(w->vfp->end(w));
 		break;
 	case BS_EOF:
-		cls = fetch_eof(sp, w->htc);
+		cls = fetch_eof(w, w->htc);
 		mklen = 1;
-		XXXAZ(w->vfp->end(sp->wrk));
+		XXXAZ(w->vfp->end(w));
 		break;
 	case BS_ERROR:
 		cls = 1;
@@ -546,11 +543,11 @@ FetchBody(const struct sess *sp, struct object *obj)
 	 * sitting on w->storage, we will always call vfp_nop_end()
 	 * to get it trimmed or thrown out if empty.
 	 */
-	AZ(vfp_nop_end(sp->wrk));
+	AZ(vfp_nop_end(w));
 
 	w->fetch_obj = NULL;
 
-	WSL(w, SLT_Fetch_Body, w->vbc->vsl_id, "%u(%s) cls %d mklen %u",
+	WSLB(w, SLT_Fetch_Body, "%u(%s) cls %d mklen %u",
 	    w->body_status, body_status(w->body_status),
 	    cls, mklen);
 
@@ -575,7 +572,7 @@ FetchBody(const struct sess *sp, struct object *obj)
 	if (cls == 0 && w->do_close)
 		cls = 1;
 
-	WSL(w, SLT_Length, w->vbc->vsl_id, "%u", obj->len);
+	WSLB(w, SLT_Length, "%u", obj->len);
 
 	{
 	/* Sanity check fetch methods accounting */
@@ -584,7 +581,7 @@ FetchBody(const struct sess *sp, struct object *obj)
 		uu = 0;
 		VTAILQ_FOREACH(st, &obj->store, list)
 			uu += st->len;
-		if (sp->objcore == NULL || (sp->objcore->flags & OC_F_PASS))
+		if (w->do_stream)
 			/* Streaming might have started freeing stuff */
 			assert (uu <= obj->len);
 		else
@@ -593,7 +590,7 @@ FetchBody(const struct sess *sp, struct object *obj)
 
 	if (mklen > 0) {
 		http_Unset(obj->http, H_Content_Length);
-		http_PrintfHeader(w, sp->vsl_id, obj->http,
+		http_PrintfHeader(w, w->vbc->vsl_id, obj->http,
 		    "Content-Length: %jd", (intmax_t)obj->len);
 	}
 



More information about the varnish-commit mailing list