r3322 - in trunk/varnish-cache/bin: varnishd varnishtest/tests

phk at projects.linpro.no phk at projects.linpro.no
Fri Oct 17 23:29:49 CEST 2008


Author: phk
Date: 2008-10-17 23:29:49 +0200 (Fri, 17 Oct 2008)
New Revision: 3322

Added:
   trunk/varnish-cache/bin/varnishtest/tests/r00345.vtc
Modified:
   trunk/varnish-cache/bin/varnishd/cache_hash.c
   trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c
Log:
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



Modified: trunk/varnish-cache/bin/varnishd/cache_hash.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_hash.c	2008-10-17 19:55:11 UTC (rev 3321)
+++ trunk/varnish-cache/bin/varnishd/cache_hash.c	2008-10-17 21:29:49 UTC (rev 3322)
@@ -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);

Modified: trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c	2008-10-17 19:55:11 UTC (rev 3321)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt_esi.c	2008-10-17 21:29:49 UTC (rev 3322)
@@ -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;
 

Added: trunk/varnish-cache/bin/varnishtest/tests/r00345.vtc
===================================================================
--- trunk/varnish-cache/bin/varnishtest/tests/r00345.vtc	                        (rev 0)
+++ trunk/varnish-cache/bin/varnishtest/tests/r00345.vtc	2008-10-17 21:29:49 UTC (rev 3322)
@@ -0,0 +1,40 @@
+# $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
+




More information about the varnish-commit mailing list