فهرست منبع

Fix connection leak. Use net.Addr.String() as freeconn map key. When 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.

Asim Aslam 12 سال پیش
والد
کامیت
e7a12e6eb5
1فایلهای تغییر یافته به همراه6 افزوده شده و 6 حذف شده
  1. 6 6
      memcache/memcache.go

+ 6 - 6
memcache/memcache.go

@@ -133,7 +133,7 @@ type Client struct {
 	selector ServerSelector
 	selector ServerSelector
 
 
 	lk       sync.Mutex
 	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.
 // Item is an item to be got or stored in a memcached server.
@@ -193,14 +193,14 @@ func (c *Client) putFreeConn(addr net.Addr, cn *conn) {
 	c.lk.Lock()
 	c.lk.Lock()
 	defer c.lk.Unlock()
 	defer c.lk.Unlock()
 	if c.freeconn == nil {
 	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 {
 	if len(freelist) >= maxIdleConnsPerAddr {
 		cn.nc.Close()
 		cn.nc.Close()
 		return
 		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) {
 func (c *Client) getFreeConn(addr net.Addr) (cn *conn, ok bool) {
@@ -209,12 +209,12 @@ func (c *Client) getFreeConn(addr net.Addr) (cn *conn, ok bool) {
 	if c.freeconn == nil {
 	if c.freeconn == nil {
 		return nil, false
 		return nil, false
 	}
 	}
-	freelist, ok := c.freeconn[addr]
+	freelist, ok := c.freeconn[addr.String()]
 	if !ok || len(freelist) == 0 {
 	if !ok || len(freelist) == 0 {
 		return nil, false
 		return nil, false
 	}
 	}
 	cn = freelist[len(freelist)-1]
 	cn = freelist[len(freelist)-1]
-	c.freeconn[addr] = freelist[:len(freelist)-1]
+	c.freeconn[addr.String()] = freelist[:len(freelist)-1]
 	return cn, true
 	return cn, true
 }
 }