[7.5] eccb50837 http2_send: Promote global BROKE_WINDOW to BANKRUPT

Simon Stridsberg simon.stridsberg at varnish-software.com
Mon Mar 18 18:26:06 UTC 2024


commit eccb50837d61fcb5a6927eef94c570bd1d03c26d
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Thu Nov 16 17:02:35 2023 +0100

    http2_send: Promote global BROKE_WINDOW to BANKRUPT
    
    When a stream times out waiting for window credits, and all the other
    streams are broke, declare the whole connection bankrupt.

diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index b575b0f11..1568e76bc 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -1360,11 +1360,12 @@ static h2_error
 h2_sweep(struct worker *wrk, struct h2_sess *h2)
 {
 	struct h2_req *r2, *r22;
-	h2_error h2e = NULL, tmo;
+	h2_error h2e, tmo;
 	vtim_real now;
 
 	ASSERT_RXTHR(h2);
 
+	h2e = h2->error;
 	now = VTIM_real();
 	if (h2e == NULL && h2->open_streams == 0 &&
 	    h2->sess->t_idle + cache_param->timeout_idle < now)
diff --git a/bin/varnishd/http2/cache_http2_send.c b/bin/varnishd/http2/cache_http2_send.c
index 0d6b3a6e7..316d13dc5 100644
--- a/bin/varnishd/http2/cache_http2_send.c
+++ b/bin/varnishd/http2/cache_http2_send.c
@@ -285,6 +285,10 @@ h2_do_window(struct worker *wrk, struct h2_req *r2,
 			assert (w > 0);
 		}
 
+		if (r2->error == H2SE_BROKE_WINDOW &&
+		    h2->open_streams <= h2->winup_streams)
+			h2->error = r2->error = H2CE_BANKRUPT;
+
 		assert(h2->winup_streams > 0);
 		h2->winup_streams--;
 
diff --git a/bin/varnishtest/tests/t02016.vtc b/bin/varnishtest/tests/t02016.vtc
index d2f5dcca8..1e5a7dc8a 100644
--- a/bin/varnishtest/tests/t02016.vtc
+++ b/bin/varnishtest/tests/t02016.vtc
@@ -6,7 +6,13 @@ server s1 {
 } -start
 
 varnish v1 -cliok "param.set feature +http2"
-varnish v1 -vcl+backend "" -start
+varnish v1 -vcl+backend {
+	sub vcl_recv {
+		if (req.url ~ "synth") {
+			return (synth(200));
+		}
+	}
+} -start
 
 # coverage for send_timeout with c1
 
@@ -66,6 +72,10 @@ client c2 {
 	} -run
 
 	stream 1 {
+		txreq -nostrend -url "/synth"
+	} -run
+
+	stream 3 {
 		txreq
 		rxhdrs
 		rxdata
@@ -75,6 +85,9 @@ client c2 {
 		expect rst.err == CANCEL
 	} -run
 
+	stream 1 {
+		txdata
+	} -run
 } -run
 
 logexpect l2 -wait
@@ -100,6 +113,10 @@ client c3 {
 	} -run
 
 	stream 1 {
+		txreq -nostrend -url "/synth"
+	} -run
+
+	stream 3 {
 		txreq
 		rxhdrs
 		rxdata
@@ -110,6 +127,9 @@ client c3 {
 		expect rst.err == CANCEL
 	} -run
 
+	stream 1 {
+		txdata
+	} -run
 } -start
 
 barrier b3 sync
diff --git a/include/tbl/h2_error.h b/include/tbl/h2_error.h
index 045ddaa59..564d78544 100644
--- a/include/tbl/h2_error.h
+++ b/include/tbl/h2_error.h
@@ -171,6 +171,14 @@ H2_ERROR(
 	/* reason */	SC_NULL,
 	/* descr */	"http/2 stream out of window credits"
 )
+
+H2_ERROR(
+	/* name */	BANKRUPT,
+	/* val */	11, /* ENHANCE_YOUR_CALM */
+	/* types */	1,
+	/* reason */	SC_BANKRUPT,
+	/* descr */	"http/2 bankrupt connection"
+)
 #  undef H2_CUSTOM_ERRORS
 #endif
 


More information about the varnish-commit mailing list