[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