From: phk Date: Fri, 17 Oct 2008 21:29:49 +0000 (+0000) Subject: ESI includes can hit the waiting list and since the state is stored X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cdeb57416f476cd1291400e87830edf5dec5197b;p=varnish ESI includes can hit the waiting list and since the state is stored 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 --- diff --git a/varnish-cache/bin/varnishd/cache_hash.c b/varnish-cache/bin/varnishd/cache_hash.c index ce6b7c0d..7ef852cb 100644 --- a/varnish-cache/bin/varnishd/cache_hash.c +++ b/varnish-cache/bin/varnishd/cache_hash.c @@ -266,7 +266,8 @@ HSH_Lookup(struct sess *sp) 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); diff --git a/varnish-cache/bin/varnishd/cache_vrt_esi.c b/varnish-cache/bin/varnishd/cache_vrt_esi.c index 8eb52aa3..c4975546 100644 --- a/varnish-cache/bin/varnishd/cache_vrt_esi.c +++ b/varnish-cache/bin/varnishd/cache_vrt_esi.c @@ -796,7 +796,6 @@ VRT_ESI(struct sess *sp) void ESI_Deliver(struct sess *sp) { - struct esi_bit *eb; struct object *obj; @@ -839,7 +838,16 @@ ESI_Deliver(struct sess *sp) 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; diff --git a/varnish-cache/bin/varnishtest/tests/r00345.vtc b/varnish-cache/bin/varnishtest/tests/r00345.vtc new file mode 100644 index 00000000..b39030c5 --- /dev/null +++ b/varnish-cache/bin/varnishtest/tests/r00345.vtc @@ -0,0 +1,40 @@ +# $Id$ + +test "#345, ESI waitinglist trouble" + +server s1 { + rxreq + txresp -body {} + 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 +