[master] 6f74146 Enforce h2_max_concurrent_streams
Dag Haavi Finstad
daghf at varnish-software.com
Mon Jan 22 09:04:09 UTC 2018
commit 6f74146f2189d24a340c194bb756ce36123cff1b
Author: Dag Haavi Finstad <daghf at varnish-software.com>
Date: Wed Jan 17 13:41:35 2018 +0100
Enforce h2_max_concurrent_streams
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 71ec6a8..6801e92 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -864,6 +864,13 @@ h2_procframe(struct worker *wrk, struct h2_sess *h2,
if (r2 == NULL && h2f->act_sidle == 0) {
if (h2->rxf_stream <= h2->highest_stream)
return (H2CE_PROTOCOL_ERROR); // rfc7540,l,1153,1158
+ if (h2->refcnt >= h2->local_settings.max_concurrent_streams) {
+ VSLb(h2->vsl, SLT_Debug,
+ "H2: stream %u: Hit maximum number of "
+ "concurrent streams", h2->rxf_stream);
+ // rfc7540,l,1200,1205
+ return (h2_tx_rst(wrk, h2, H2SE_REFUSED_STREAM));
+ }
h2->highest_stream = h2->rxf_stream;
r2 = h2_new_req(wrk, h2, h2->rxf_stream, NULL);
AN(r2);
diff --git a/bin/varnishtest/tests/t02012.vtc b/bin/varnishtest/tests/t02012.vtc
new file mode 100644
index 0000000..5319453
--- /dev/null
+++ b/bin/varnishtest/tests/t02012.vtc
@@ -0,0 +1,63 @@
+varnishtest "Test max_concurrent_streams"
+
+barrier b1 sock 5
+barrier b2 sock 3
+barrier b3 cond 2
+barrier b4 cond 2
+
+server s1 {
+ rxreq
+ txresp
+} -start
+
+varnish v1 -cliok "param.set feature +http2"
+varnish v1 -cliok "param.set debug +syncvsl"
+varnish v1 -cliok "param.set h2_max_concurrent_streams 3"
+
+varnish v1 -vcl+backend {
+ import vtc;
+ sub vcl_deliver {
+ if (req.http.sync) {
+ vtc.barrier_sync("${b1_sock}");
+ vtc.barrier_sync("${b2_sock}");
+ }
+ }
+} -start
+
+client c1 {
+ stream 1 {
+ txreq -hdr "sync" "1"
+ barrier b3 sync
+ barrier b1 sync
+ rxresp
+ expect resp.status == 200
+ } -start
+
+ stream 3 {
+ barrier b3 sync
+ txreq -hdr "sync" "1"
+ barrier b4 sync
+ barrier b1 sync
+ rxresp
+ expect resp.status == 200
+ } -start
+
+ stream 5 {
+ barrier b4 sync
+ barrier b1 sync
+ txreq
+ rxrst
+ expect rst.err == REFUSED_STREAM
+ barrier b2 sync
+ } -run
+
+ stream 1 -wait
+ stream 3 -wait
+
+ stream 7 {
+ txreq
+ rxresp
+ expect resp.status == 200
+ } -run
+
+} -run
More information about the varnish-commit
mailing list