on the worker thread stack, we cannot just let another thread pick
up.
This is not as much a fix as a workaround: simply sleep until the
object we wait for is no longer busy.
The issue may have to be revisited in the long run, but for 2.0.x
this will have to do.
Fixes #345
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@3322
d4fa192b-c00b-0410-8231-
f00ffab90ce4
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);
void
ESI_Deliver(struct sess *sp)
{
-
struct esi_bit *eb;
struct object *obj;
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;
--- /dev/null
+# $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
+ rxresp
+ expect resp.bodylen == 4
+} -run
+