• Brad Fitzpatrick's avatar
    net/http: fix rare Transport leak, remove incorrect defensive logic · 631402f1
    Brad Fitzpatrick authored
    Remove some incorrect code that was present after since I added
    support for idle timeouts in CL 22670.
    
    This code actually caused a bug (a rare goroutine leak) rather than
    prevent a bogus connection reuse.
    
    The t.idleMu mutex already protects most the invariants, including an
    explicit Stop call. There's only one Stop call on that timer, and it's
    guarded by t.idleMu. What idleMu doesn't protect against is the timer
    firing on its own. But we don't need code to protect against that case
    because the goroutine that is created via AfterFunc when the timer
    fires already checks the invariants:
    
      // closeConnIfStillIdle closes the connection if it's still sitting idle.
      // This is what's called by the persistConn's idleTimer, and is run in its
      // own goroutine.
      func (pc *persistConn) closeConnIfStillIdle() {
         t := pc.t
         t.idleMu.Lock()
         defer t.idleMu.Unlock()
         if _, ok := t.idleLRU.m[pc]; !ok {
           // Not idle.
           return
         }
    
    (note the "Not idle." part).
    
    Tested by hand with the repro code from #25621. No more leaks.
    
    Fixes #25621
    
    Change-Id: Idf011a4cb1fcd01f55a5a6269e4c0ee5f4446786
    Reviewed-on: https://go-review.googlesource.com/123315
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    631402f1
Name
Last commit
Last update
..
cgi Loading commit data...
cookiejar Loading commit data...
fcgi Loading commit data...
httptest Loading commit data...
httptrace Loading commit data...
httputil Loading commit data...
internal Loading commit data...
pprof Loading commit data...
testdata Loading commit data...
client.go Loading commit data...
client_test.go Loading commit data...
clientserver_test.go Loading commit data...
cookie.go Loading commit data...
cookie_test.go Loading commit data...
doc.go Loading commit data...
example_test.go Loading commit data...
export_test.go Loading commit data...
filetransport.go Loading commit data...
filetransport_test.go Loading commit data...
fs.go Loading commit data...
fs_test.go Loading commit data...
h2_bundle.go Loading commit data...
header.go Loading commit data...
header_test.go Loading commit data...
http.go Loading commit data...
http_test.go Loading commit data...
jar.go Loading commit data...
main_test.go Loading commit data...
method.go Loading commit data...
npn_test.go Loading commit data...
proxy_test.go Loading commit data...
race.go Loading commit data...
range_test.go Loading commit data...
readrequest_test.go Loading commit data...
request.go Loading commit data...
request_test.go Loading commit data...
requestwrite_test.go Loading commit data...
response.go Loading commit data...
response_test.go Loading commit data...
responsewrite_test.go Loading commit data...
roundtrip.go Loading commit data...
roundtrip_js.go Loading commit data...
serve_test.go Loading commit data...
server.go Loading commit data...
sniff.go Loading commit data...
sniff_test.go Loading commit data...
socks_bundle.go Loading commit data...
status.go Loading commit data...
transfer.go Loading commit data...
transfer_test.go Loading commit data...
transport.go Loading commit data...
transport_internal_test.go Loading commit data...
transport_test.go Loading commit data...
triv.go Loading commit data...