Commit 139891e8 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

net/http/httptest: clean up unnecessary goroutine

Finishes cleanup which was too late to do when discovered during the
Go 1.6 cycle.

Fixes #14291

Change-Id: Idc69fadbba10baf246318a22b366709eff088a75
Reviewed-on: https://go-review.googlesource.com/21360
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarAndrew Gerrand <adg@golang.org>
parent e6066711
...@@ -202,12 +202,10 @@ func (s *Server) logCloseHangDebugInfo() { ...@@ -202,12 +202,10 @@ func (s *Server) logCloseHangDebugInfo() {
// CloseClientConnections closes any open HTTP connections to the test Server. // CloseClientConnections closes any open HTTP connections to the test Server.
func (s *Server) CloseClientConnections() { func (s *Server) CloseClientConnections() {
var conns int
ch := make(chan bool)
s.mu.Lock() s.mu.Lock()
nconn := len(s.conns)
ch := make(chan struct{}, nconn)
for c := range s.conns { for c := range s.conns {
conns++
s.closeConnChan(c, ch) s.closeConnChan(c, ch)
} }
s.mu.Unlock() s.mu.Unlock()
...@@ -220,7 +218,7 @@ func (s *Server) CloseClientConnections() { ...@@ -220,7 +218,7 @@ func (s *Server) CloseClientConnections() {
// in tests. // in tests.
timer := time.NewTimer(5 * time.Second) timer := time.NewTimer(5 * time.Second)
defer timer.Stop() defer timer.Stop()
for i := 0; i < conns; i++ { for i := 0; i < nconn; i++ {
select { select {
case <-ch: case <-ch:
case <-timer.C: case <-timer.C:
...@@ -294,7 +292,7 @@ func (s *Server) closeConn(c net.Conn) { s.closeConnChan(c, nil) } ...@@ -294,7 +292,7 @@ func (s *Server) closeConn(c net.Conn) { s.closeConnChan(c, nil) }
// closeConnChan is like closeConn, but takes an optional channel to receive a value // closeConnChan is like closeConn, but takes an optional channel to receive a value
// when the goroutine closing c is done. // when the goroutine closing c is done.
func (s *Server) closeConnChan(c net.Conn, done chan<- bool) { func (s *Server) closeConnChan(c net.Conn, done chan<- struct{}) {
if runtime.GOOS == "plan9" { if runtime.GOOS == "plan9" {
// Go's Plan 9 net package isn't great at unblocking reads when // Go's Plan 9 net package isn't great at unblocking reads when
// their underlying TCP connections are closed. Don't trust // their underlying TCP connections are closed. Don't trust
...@@ -304,20 +302,10 @@ func (s *Server) closeConnChan(c net.Conn, done chan<- bool) { ...@@ -304,20 +302,10 @@ func (s *Server) closeConnChan(c net.Conn, done chan<- bool) {
s.forgetConn(c) s.forgetConn(c)
} }
// Somewhere in the chaos of https://golang.org/cl/15151 we found that c.Close()
// some types of conns were blocking in Close too long (or deadlocking?) if done != nil {
// and we had to call Close in a goroutine. I (bradfitz) forget what done <- struct{}{}
// that was at this point, but I suspect it was *tls.Conns, which }
// were later fixed in https://golang.org/cl/18572, so this goroutine
// is _probably_ unnecessary now. But it's too late in Go 1.6 too remove
// it with confidence.
// TODO(bradfitz): try to remove it for Go 1.7. (golang.org/issue/14291)
go func() {
c.Close()
if done != nil {
done <- true
}
}()
} }
// forgetConn removes c from the set of tracked conns and decrements it from the // forgetConn removes c from the set of tracked conns and decrements it from the
......
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