summaryrefslogtreecommitdiff
blob: 1dd4e2e5940690c23c86e1d6645789d75a42c757 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
diff -Naur varnish-2.0.1.orig/bin/varnishd/cache_hash.c varnish-2.0.1/bin/varnishd/cache_hash.c
--- varnish-2.0.1.orig/bin/varnishd/cache_hash.c	2008-10-17 20:59:49.000000000 +0200
+++ varnish-2.0.1/bin/varnishd/cache_hash.c	2008-10-23 21:00:29.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);
diff -Naur varnish-2.0.1.orig/bin/varnishd/cache_vrt_esi.c varnish-2.0.1/bin/varnishd/cache_vrt_esi.c
--- varnish-2.0.1.orig/bin/varnishd/cache_vrt_esi.c	2008-10-17 20:59:49.000000000 +0200
+++ varnish-2.0.1/bin/varnishd/cache_vrt_esi.c	2008-10-23 20:59:35.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;
 
diff -Naur varnish-2.0.1.orig/varnishtest/tests/r00345.vtc varnish-2.0.1/varnishtest/tests/r00345.vtc
--- varnish-2.0.1.orig/varnishtest/tests/r00345.vtc	1970-01-01 01:00:00.000000000 +0100
+++ varnish-2.0.1/varnishtest/tests/r00345.vtc	2008-10-23 20:56:40.000000000 +0200
@@ -0,0 +1,40 @@
+# $Id: varnish-2.0.1-fix-ESI-coredump.diff,v 1.1 2008/10/23 19:30:05 bangert Exp $
+
+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
+