Commit 0cfa8698 authored by Dag Haavi Finstad's avatar Dag Haavi Finstad

Don't HTC_RxStuff with a non-reserved workspace

This commit partially reverts and reworks b9f7170b. We now do the "wait
for active streams" handling via the loop in h2_new_session, to ensure
the workspace is in a predictable state once HTC_RxStuff is called
again.

Fixes: #2539
parent fe1ebfe4
...@@ -891,22 +891,20 @@ h2_rxframe(struct worker *wrk, struct h2_sess *h2) ...@@ -891,22 +891,20 @@ h2_rxframe(struct worker *wrk, struct h2_sess *h2)
enum htc_status_e hs; enum htc_status_e hs;
h2_frame h2f; h2_frame h2f;
h2_error h2e; h2_error h2e;
int again;
struct h2_req *r2, *r22; struct h2_req *r2, *r22;
char b[8]; char b[8];
ASSERT_RXTHR(h2); ASSERT_RXTHR(h2);
(void)VTCP_blocking(*h2->htc->rfd); (void)VTCP_blocking(*h2->htc->rfd);
while (1) {
h2->sess->t_idle = VTIM_real(); h2->sess->t_idle = VTIM_real();
hs = HTC_RxStuff(h2->htc, h2_frame_complete, hs = HTC_RxStuff(h2->htc, h2_frame_complete,
NULL, NULL, NAN, NULL, NULL, NAN,
h2->sess->t_idle + cache_param->timeout_idle, h2->sess->t_idle + cache_param->timeout_idle,
16384 + 9); // rfc7540,l,4228,4228 16384 + 9); // rfc7540,l,4228,4228
if (hs == HTC_S_COMPLETE) switch (hs) {
case HTC_S_COMPLETE:
break; break;
else if (hs == HTC_S_TIMEOUT) { case HTC_S_TIMEOUT:
again = 0;
VTAILQ_FOREACH_SAFE(r2, &h2->streams, list, r22) { VTAILQ_FOREACH_SAFE(r2, &h2->streams, list, r22) {
switch (r2->state) { switch (r2->state) {
case H2_S_CLOSED: case H2_S_CLOSED:
...@@ -916,15 +914,13 @@ h2_rxframe(struct worker *wrk, struct h2_sess *h2) ...@@ -916,15 +914,13 @@ h2_rxframe(struct worker *wrk, struct h2_sess *h2)
case H2_S_OPEN: case H2_S_OPEN:
case H2_S_CLOS_REM: case H2_S_CLOS_REM:
case H2_S_CLOS_LOC: case H2_S_CLOS_LOC:
again = 1; return (1);
break;
default: default:
break; break;
} }
} }
if (again) /* FALLTHROUGH */
continue; default:
}
Lck_Lock(&h2->sess->mtx); Lck_Lock(&h2->sess->mtx);
VSLb(h2->vsl, SLT_Debug, "H2: No frame (hs=%d)", hs); VSLb(h2->vsl, SLT_Debug, "H2: No frame (hs=%d)", hs);
h2->error = H2CE_NO_ERROR; h2->error = H2CE_NO_ERROR;
......
varnishtest "2359: H/2 Avoid RxStuff with a non-reserved WS"
barrier b1 sock 2
server s1 {
rxreq
txresp
} -start
varnish v1 -cliok "param.set feature +http2"
varnish v1 -cliok "param.set timeout_idle 1"
varnish v1 -vcl+backend {
import vtc;
sub vcl_deliver {
vtc.barrier_sync("${b1_sock}");
}
} -start
client c1 {
stream 1 {
txreq
rxresp
expect resp.status == 200
} -start
delay 3
barrier b1 sync
stream 1 -wait
} -run
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment