net/http: TestCloseIdleConnections_h2 didn't close connection #22413
Comments
The test flakes every ~2 of 100000 runs. This started happening after https://golang.org/cl/70510 (or more correctly, https://golang.org/cl/71611). Before that CL, we did:
After that CL, we do:
TestCloseIdleConnections_h2 flakes when we call CloseIdleConnections between steps 2 and 3. Ideally, we should not remove a stream from the ClientConn until the user calls Response.Body.Close. |
This was referenced Nov 2, 2017
Change https://golang.org/cl/80139 mentions this issue: |
gopherbot
pushed a commit
to golang/net
that referenced
this issue
Nov 28, 2017
That test makes a request with no body and receives a response with no body. The client will receive a HEADERS frame with END_STREAM. The test assumes that the stream is closed immediately on receipt of that HEADERS frame, i.e., before RoundTrip returns. This assumption was broken by https://golang.org/cl/70510, which made stream closure asynchronous w.r.t. RoundTrip. To fix TestCloseIdleConnections_h2 while preserving the intent of CL 70510, we break processHeaders into two cases: 1. The request has a body. In this case, END_STREAM puts the stream in a half-closed-remote state, which means the connection is not necessarily idle when RoundTrip returns (since the request body is still being uploaded). In this case, we preserve the behavior from CL 70510. 2. The request does not have a body. In this case, END_STREAM puts the stream in a closed state and we must close the stream before returning from RoundTrip. The following command passes when this CL is merged into net/http: go test -count=100000 -run=TestCloseIdleConnections_h2 net/http Updates golang/go#22413 Change-Id: Iff2a0685a636ad51bff380e86a42b0d0eea984e5 Reviewed-on: https://go-review.googlesource.com/80139 Run-TryBot: Tom Bergan <tombergan@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Change https://golang.org/cl/81276 mentions this issue: |
c3mb0
pushed a commit
to c3mb0/net
that referenced
this issue
Apr 2, 2018
That test makes a request with no body and receives a response with no body. The client will receive a HEADERS frame with END_STREAM. The test assumes that the stream is closed immediately on receipt of that HEADERS frame, i.e., before RoundTrip returns. This assumption was broken by https://golang.org/cl/70510, which made stream closure asynchronous w.r.t. RoundTrip. To fix TestCloseIdleConnections_h2 while preserving the intent of CL 70510, we break processHeaders into two cases: 1. The request has a body. In this case, END_STREAM puts the stream in a half-closed-remote state, which means the connection is not necessarily idle when RoundTrip returns (since the request body is still being uploaded). In this case, we preserve the behavior from CL 70510. 2. The request does not have a body. In this case, END_STREAM puts the stream in a closed state and we must close the stream before returning from RoundTrip. The following command passes when this CL is merged into net/http: go test -count=100000 -run=TestCloseIdleConnections_h2 net/http Updates golang/go#22413 Change-Id: Iff2a0685a636ad51bff380e86a42b0d0eea984e5 Reviewed-on: https://go-review.googlesource.com/80139 Run-TryBot: Tom Bergan <tombergan@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Seen on linux-arm trybot that Ian run against CL 72592
https://storage.googleapis.com/go-build-log/af50a7e4/linux-arm_10535f18.log
Alex
CC @tombergan if you are interested
The text was updated successfully, but these errors were encountered: