[master] a6d46e7 Stream.
Poul-Henning Kamp
phk at varnish-cache.org
Fri Sep 6 23:50:45 CEST 2013
commit a6d46e7debd71be4c5facf4d58220217756da277
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Fri Sep 6 21:50:01 2013 +0000
Stream.
(Don't tell me nothing good ever comes from DB's delayed trains...)
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 063c49c..01f0a33 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -228,6 +228,7 @@ ssize_t
VBO_waitlen(struct busyobj *bo, ssize_t l)
{
Lck_Lock(&bo->mtx);
+ assert(l <= bo->fetch_obj->len);
while (1) {
if (bo->fetch_obj->len > l || bo->state >= BOS_FINISHED) {
l = bo->fetch_obj->len;
diff --git a/bin/varnishd/cache/cache_http1_deliver.c b/bin/varnishd/cache/cache_http1_deliver.c
index 1678eb5..6ed3110 100644
--- a/bin/varnishd/cache/cache_http1_deliver.c
+++ b/bin/varnishd/cache/cache_http1_deliver.c
@@ -158,6 +158,7 @@ v1d_dorange(struct req *req, const char *r)
static void
v1d_WriteDirObj(struct req *req)
{
+ int i;
ssize_t len;
struct objiter *oi;
void *ptr;
@@ -167,10 +168,12 @@ v1d_WriteDirObj(struct req *req)
oi = ObjIterBegin(req->wrk, req->obj);
XXXAN(oi);
- while (ObjIter(oi, &ptr, &len)) {
- if (VDP_bytes(req, VDP_NULL, ptr, len))
- break;
- }
+ do {
+ i = ObjIter(oi, &ptr, &len);
+ if (i != 0)
+ if (VDP_bytes(req, i == 2 ? VDP_FLUSH : VDP_NULL, ptr, len))
+ break;
+ } while (i);
(void)VDP_bytes(req, VDP_FINISH, NULL, 0);
ObjIterEnd(&oi);
}
diff --git a/bin/varnishd/cache/cache_http1_fetch.c b/bin/varnishd/cache/cache_http1_fetch.c
index e8dbdaa..d15d6c9 100644
--- a/bin/varnishd/cache/cache_http1_fetch.c
+++ b/bin/varnishd/cache/cache_http1_fetch.c
@@ -381,7 +381,8 @@ V1F_fetch_body(struct worker *wrk, struct busyobj *bo)
*/
st = VTAILQ_LAST(&bo->fetch_obj->store, storagehead);
- if (st != NULL) {
+ /* XXX: Temporary: Only trim if we are not streaming */
+ if (st != NULL && !bo->do_stream) {
/* XXX: is any of this safe under streaming ? */
if (st->len == 0) {
VTAILQ_REMOVE(&bo->fetch_obj->store, st, list);
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index 3db119d..2ca0a01 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -40,6 +40,7 @@ struct objiter {
struct object *obj;
struct storage *st;
struct worker *wrk;
+ ssize_t len;
};
struct objiter *
@@ -54,29 +55,49 @@ ObjIterBegin(struct worker *wrk, struct object *obj)
oi->obj = obj;
oi->wrk = wrk;
oi->bo = HSH_RefBusy(obj->objcore);
- while (obj->objcore->busyobj != NULL)
- (void)usleep(10000);
return (oi);
}
int
ObjIter(struct objiter *oi, void **p, ssize_t *l)
{
+ ssize_t ol;
+ ssize_t nl;
CHECK_OBJ_NOTNULL(oi, OBJITER_MAGIC);
AN(p);
AN(l);
- if (oi->st == NULL)
- oi->st = VTAILQ_FIRST(&oi->obj->store);
- else
- oi->st = VTAILQ_NEXT(oi->st, list);
- if (oi->st != NULL) {
- *p = oi->st->ptr;
- *l = oi->st->len;
- return (1);
+ if (oi->bo == NULL) {
+ if (oi->st == NULL)
+ oi->st = VTAILQ_FIRST(&oi->obj->store);
+ else
+ oi->st = VTAILQ_NEXT(oi->st, list);
+ if (oi->st != NULL) {
+ *p = oi->st->ptr;
+ *l = oi->st->len;
+ return (1);
+ }
+ return (0);
+ } else {
+ ol = oi->len;
+ nl = VBO_waitlen(oi->bo, ol);
+ VSL(SLT_Debug, 0, "STREAM %zd -> %zd", ol, nl);
+ if (nl == ol)
+ return (0);
+ VTAILQ_FOREACH(oi->st, &oi->obj->store, list) {
+ if (oi->st->len <= ol) {
+ ol -= oi->st->len;
+ nl -= oi->st->len;
+ } else {
+ *p = oi->st->ptr + ol;
+ *l = (nl - ol);
+ oi->len += (nl - ol);
+ return (2);
+ }
+ }
+ WRONG("ran off end");
}
- return (0);
}
void
diff --git a/bin/varnishtest/tests/b00029.vtc b/bin/varnishtest/tests/b00029.vtc
index 8df3997..386e156 100644
--- a/bin/varnishtest/tests/b00029.vtc
+++ b/bin/varnishtest/tests/b00029.vtc
@@ -3,7 +3,13 @@ varnishtest "Test orderly connection closure"
server s1 {
rxreq
- txresp -bodylen 130000
+ txresp -nolen -hdr "Transfer-encoding: chunked"
+ delay .2
+ chunkedlen 30000
+ delay .2
+ chunkedlen 100000
+ delay .2
+ chunkedlen 0
} -start
varnish v1 -vcl+backend { } -start
More information about the varnish-commit
mailing list