]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: keep idle conns sorted by usage
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 2 May 2016 22:22:25 +0000 (22:22 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 3 May 2016 00:25:33 +0000 (00:25 +0000)
Addressing feedback from Alan Su in https://golang.org/cl/22655

Change-Id: Ie0724efea2b4da67503c074e265ec7f8d7de7791
Reviewed-on: https://go-review.googlesource.com/22709
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/http/transport.go

index 032d8af4a1bcdb21e23453bf674c11ea6e4a0dd0..7fdd94e05bc768e7dd6966d68e70e4293f24a01a 100644 (file)
@@ -68,8 +68,8 @@ const DefaultMaxIdleConnsPerHost = 2
 // See the package docs for more about HTTP/2.
 type Transport struct {
        idleMu     sync.Mutex
-       wantIdle   bool // user has requested to close all idle conns
-       idleConn   map[connectMethodKey][]*persistConn
+       wantIdle   bool                                // user has requested to close all idle conns
+       idleConn   map[connectMethodKey][]*persistConn // most recently used at end
        idleConnCh map[connectMethodKey]chan *persistConn
        idleLRU    connLRU
 
@@ -690,7 +690,7 @@ func (t *Transport) getIdleConn(cm connectMethod) (pconn *persistConn, idleSince
                        delete(t.idleConn, key)
                } else {
                        // 2 or more cached connections; use the most
-                       // recently used one.
+                       // recently used one at the end.
                        pconn = pconns[len(pconns)-1]
                        t.idleConn[key] = pconns[:len(pconns)-1]
                }
@@ -740,7 +740,9 @@ func (t *Transport) removeIdleConnLocked(pconn *persistConn) {
                        if v != pconn {
                                continue
                        }
-                       pconns[i] = pconns[len(pconns)-1]
+                       // Slide down, keeping most recently-used
+                       // conns at the end.
+                       copy(pconns[i:], pconns[i+1:])
                        t.idleConn[key] = pconns[:len(pconns)-1]
                        break
                }