[master] e50f3e8 Move yet a little bit closer to streaming.

Poul-Henning Kamp phk at varnish-cache.org
Mon Aug 26 10:40:07 CEST 2013


commit e50f3e801821a14a4d71f2c6d5264002d41653e0
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Aug 26 08:39:42 2013 +0000

    Move yet a little bit closer to streaming.

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 0032478..bde06c8 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -205,6 +205,9 @@ vbf_stp_fetchhdr(struct worker *wrk, struct busyobj *bo)
 
 	VCL_backend_response_method(bo->vcl, wrk, NULL, bo, bo->beresp->ws);
 
+	if (bo->do_esi)
+		bo->do_stream = 0;
+
 	if (wrk->handling == VCL_RET_DELIVER)
 		return (F_STP_FETCH);
 	if (wrk->handling == VCL_RET_RETRY) {
diff --git a/bin/varnishd/cache/cache_http1_fetch.c b/bin/varnishd/cache/cache_http1_fetch.c
index c3e6b2b..2d9928c 100644
--- a/bin/varnishd/cache/cache_http1_fetch.c
+++ b/bin/varnishd/cache/cache_http1_fetch.c
@@ -390,11 +390,11 @@ V1F_fetch_body(struct worker *wrk, struct busyobj *bo)
 
 	st = VTAILQ_LAST(&bo->fetch_obj->store, storagehead);
 	if (st != NULL) {
+		/* XXX: is any of this safe under streaming ? */
 		if (st->len == 0) {
 			VTAILQ_REMOVE(&bo->fetch_obj->store, st, list);
 			STV_free(st);
 		} else if (st->len < st->space) {
-			/* XXX: is this safe under streaming ? */
 			STV_trim(st, st->len, 1);
 		}
 	}
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index bd97a59..396ec18 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -174,7 +174,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		/* In ESI mode, we can't know the aggregate length */
 		req->res_mode &= ~RES_LEN;
 		req->res_mode |= RES_ESI;
-	} else {
+	} else if (req->busyobj == NULL) {
 		req->res_mode |= RES_LEN;
 	}
 
@@ -225,14 +225,16 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		wrk->handling = VCL_RET_DELIVER;
 
 	if (req->busyobj != NULL) {
-		AN(req->busyobj->do_stream);
+		VBO_waitstate(req->busyobj, BOS_FINISHED);
 		/* Don't stream if already finished */
 		if (req->busyobj->state != BOS_FINISHED) {
+			AN(req->busyobj->do_stream);
 			req->req_step = R_STP_STREAM;
 			return (REQ_FSM_MORE);
 		}
 		VBO_DerefBusyObj(wrk, &req->busyobj);
 	}
+	AZ(req->busyobj);
 
 	if (wrk->handling == VCL_RET_RESTART) {
 		(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
@@ -377,11 +379,11 @@ cnt_fetch(struct worker *wrk, struct req *req)
 	assert(bo->refcount > 0);
 	(void)HTTP1_DiscardReqBody(req);
 
-	/* If we are not allowed to stream, don't. */
-	if (1 || !bo->do_stream)  			// XXX
+	VBO_waitstate(bo, BOS_FETCHING);
+
+	/* bo->do_stream is not valid until after vcl_backend_response{} */
+	if (!bo->do_stream)
 		VBO_waitstate(bo, BOS_FINISHED);
-	else
-		VBO_waitstate(bo, BOS_FETCHING);
 
 	if (bo->state == BOS_FAILED) {
 		VBO_DerefBusyObj(wrk, &req->busyobj);
@@ -393,7 +395,8 @@ cnt_fetch(struct worker *wrk, struct req *req)
 	assert (bo->state >= BOS_FETCHING);
 	req->err_code = bo->err_code;
 	req->obj = bo->fetch_obj;
-	VBO_DerefBusyObj(wrk, &req->busyobj);
+	if (bo->state == BOS_FINISHED)
+		VBO_DerefBusyObj(wrk, &req->busyobj);
 	assert(WRW_IsReleased(wrk));
 	req->req_step = R_STP_DELIVER;
 	return (REQ_FSM_MORE);
diff --git a/bin/varnishtest/tests/r00416.vtc b/bin/varnishtest/tests/r00416.vtc
index 3d0ed71..3ad2a86 100644
--- a/bin/varnishtest/tests/r00416.vtc
+++ b/bin/varnishtest/tests/r00416.vtc
@@ -76,7 +76,11 @@ server s1 {
 		-body "foo"
 } -start
 
-varnish v1 -vcl+backend {} -start
+varnish v1 -vcl+backend {
+	sub vcl_backend_response {
+		set beresp.do_stream = false;
+	}
+} -start
 
 client c1 {
 	txreq \
diff --git a/bin/varnishtest/tests/r00730.vtc b/bin/varnishtest/tests/r00730.vtc
index 6ed2847..4e4fe24 100644
--- a/bin/varnishtest/tests/r00730.vtc
+++ b/bin/varnishtest/tests/r00730.vtc
@@ -8,6 +8,9 @@ server s1 {
 } -start
 
 varnish v1 -vcl+backend {
+	sub vcl_backend_response {
+		set beresp.do_stream = false;
+	}
 } -start
 
 client c1 {
@@ -21,6 +24,9 @@ varnish v1 -vcl+backend {
 	sub vcl_recv {
 		return (pass);
 	}
+	sub vcl_backend_response {
+		set beresp.do_stream = false;
+	}
 } 
 
 client c1 {
diff --git a/bin/varnishtest/tests/r01014.vtc b/bin/varnishtest/tests/r01014.vtc
index 53a4473..bb15012 100644
--- a/bin/varnishtest/tests/r01014.vtc
+++ b/bin/varnishtest/tests/r01014.vtc
@@ -5,9 +5,14 @@ server s1 {
 	txresp -nolen -hdr "Content-Encoding: gzip" -hdr "Content-Length:"
 } -start
 
-varnish v1 -vcl+backend { } -start
+varnish v1 -vcl+backend {
+	sub vcl_backend_response {
+		set beresp.do_stream = false;
+	}
+} -start
 
 client c1 {
 	txreq
 	rxresp
+	expect resp.status == 503
 } -run
diff --git a/bin/varnishtest/tests/r01175.vtc b/bin/varnishtest/tests/r01175.vtc
index afb5642..e7c05bf 100644
--- a/bin/varnishtest/tests/r01175.vtc
+++ b/bin/varnishtest/tests/r01175.vtc
@@ -8,6 +8,7 @@ server s1 {
 varnish v1 -storage "-s test=malloc,1M" -vcl+backend {
 	sub vcl_backend_response {
 		set beresp.storage = "test";
+		set beresp.do_stream = false;
 	}
 } -start
 



More information about the varnish-commit mailing list