1
0
mirror of https://github.com/golang/go synced 2024-11-18 20:24:41 -07:00

net/http: avoid leaking goroutines when TestServerGracefulClose retries

If the call to ReadString returns an error, the closure in
testServerGracefulClose will return an error and retry the test with a
longer timeout. If that happens, we need to wait for the conn.Write
goroutine to complete so that we don't leak connections across tests.

Updates #57084.
Fixes #62643.

Change-Id: Ia86c1bbd0a5e5d0aeccf4dfeb994c19d1fb10b00
Reviewed-on: https://go-review.googlesource.com/c/go/+/528398
Auto-Submit: Bryan Mills <bcmills@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
Bryan C. Mills 2023-09-15 10:37:08 -04:00 committed by Gopher Robot
parent 08cdfd06ed
commit 561a507905

View File

@ -3135,12 +3135,19 @@ func testServerGracefulClose(t *testing.T, mode testMode) {
if err != nil {
return err
}
defer conn.Close()
writeErr := make(chan error)
go func() {
_, err := conn.Write(req)
writeErr <- err
}()
defer func() {
conn.Close()
// Wait for write to finish. This is a broken pipe on both
// Darwin and Linux, but checking this isn't the point of
// the test.
<-writeErr
}()
br := bufio.NewReader(conn)
lineNum := 0
for {
@ -3156,10 +3163,6 @@ func testServerGracefulClose(t *testing.T, mode testMode) {
t.Errorf("Response line = %q; want a 401", line)
}
}
// Wait for write to finish. This is a broken pipe on both
// Darwin and Linux, but checking this isn't the point of
// the test.
<-writeErr
return nil
})
}