[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