|
@@ -0,0 +1,82 @@
+--- bin/varnishd/cache_hash.c.orig 2008-10-20 10:16:48.000000000 +0200
++++ bin/varnishd/cache_hash.c 2008-10-20 10:17:45.000000000 +0200
+@@ -266,7 +266,8 @@
+
+ if (busy_o != NULL) {
+ /* There are one or more busy objects, wait for them */
+- VTAILQ_INSERT_TAIL(&oh->waitinglist, sp, list);
++ if (sp->esis == 0)
++ VTAILQ_INSERT_TAIL(&oh->waitinglist, sp, list);
+ sp->objhead = oh;
+ UNLOCK(&oh->mtx);
+ return (NULL);
+--- bin/varnishd/cache_vrt_esi.c.orig 2008-10-20 10:17:01.000000000 +0200
++++ bin/varnishd/cache_vrt_esi.c 2008-10-20 10:20:03.000000000 +0200
+@@ -796,7 +796,6 @@
+ void
+ ESI_Deliver(struct sess *sp)
+ {
+-
+ struct esi_bit *eb;
+ struct object *obj;
+
+@@ -839,7 +838,16 @@
+ sp->step = STP_RECV;
+ http_ForceGet(sp->http);
+ http_Unset(sp->http, H_Content_Length);
+- CNT_Session(sp);
++ while (1) {
++ CNT_Session(sp);
++ if (sp->step == STP_DONE)
++ break;
++ AN(sp->wrk);
++ WSL_Flush(sp->wrk, 0);
++ DSL(0x20, SLT_Debug, sp->id, "loop waiting for ESI");
++ usleep(10000);
++ }
++ assert(sp->step == STP_DONE);
+ sp->esis--;
+ sp->obj = obj;
+
+--- bin/varnishtest/tests/r00345.vtc.orig 2008-10-20 10:24:38.000000000 +0200
++++ bin/varnishtest/tests/r00345.vtc 2008-10-20 10:22:25.000000000 +0200
+@@ -0,0 +1,39 @@
++# Id$
++
++test "#345, ESI waitinglist trouble"
++
++server s1 {
++ rxreq
++ txresp -body {<esi:include src="someurl">}
++ rxreq
++ sema r1 sync 2
++ delay 1
++ txresp -body {DATA}
++} -start
++
++varnish v1 -arg "-p diag_bitmap=0x20" -vcl+backend {
++ sub vcl_fetch {
++ if (req.url == "/") {
++ esi;
++ }
++ }
++} -start
++
++client c1 {
++ txreq
++ rxresp
++ expect resp.bodylen == 4
++} -start
++
++client c2 {
++ txreq
++ sema r1 sync 2
++ rxresp
++ expect resp.bodylen == 4
++} -run
++
++client c1 {
++ txreq
++ xresp
++ expect resp.bodylen == 4
++} -run
|