Skip to content

Commit

Permalink
Fix connection leak. Use net.Addr.String() as freeconn map key. When …
Browse files Browse the repository at this point in the history
…the function SetServers is called the ServerList is replaced by a new set of net.Addr interfaces which no longer match those used as keys for the freeconn map. The underlying data structure is usually a TCPaddr or UnixAddr pointer. Go's equality operation on the map keys looks at the underlying pointer and thinks they are not the same so continues to create new connections assuming it does not have any free.
  • Loading branch information
Asim Aslam authored and Asim Aslam committed Sep 9, 2013
1 parent 2aa6507 commit e7a12e6
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions memcache/memcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ type Client struct {
selector ServerSelector

lk sync.Mutex
freeconn map[net.Addr][]*conn
freeconn map[string][]*conn
}

// Item is an item to be got or stored in a memcached server.
Expand Down Expand Up @@ -193,14 +193,14 @@ func (c *Client) putFreeConn(addr net.Addr, cn *conn) {
c.lk.Lock()
defer c.lk.Unlock()
if c.freeconn == nil {
c.freeconn = make(map[net.Addr][]*conn)
c.freeconn = make(map[string][]*conn)
}
freelist := c.freeconn[addr]
freelist := c.freeconn[addr.String()]
if len(freelist) >= maxIdleConnsPerAddr {
cn.nc.Close()
return
}
c.freeconn[addr] = append(freelist, cn)
c.freeconn[addr.String()] = append(freelist, cn)
}

func (c *Client) getFreeConn(addr net.Addr) (cn *conn, ok bool) {
Expand All @@ -209,12 +209,12 @@ func (c *Client) getFreeConn(addr net.Addr) (cn *conn, ok bool) {
if c.freeconn == nil {
return nil, false
}
freelist, ok := c.freeconn[addr]
freelist, ok := c.freeconn[addr.String()]
if !ok || len(freelist) == 0 {
return nil, false
}
cn = freelist[len(freelist)-1]
c.freeconn[addr] = freelist[:len(freelist)-1]
c.freeconn[addr.String()] = freelist[:len(freelist)-1]
return cn, true
}

Expand Down

0 comments on commit e7a12e6

Please sign in to comment.