Fix MinIdleConns and MaxConnAge

This commit is contained in:
Vladimir Mihailenco 2019-03-25 13:02:31 +02:00
parent 9ecae37814
commit b706478fdc
5 changed files with 27 additions and 21 deletions

View File

@ -17,14 +17,16 @@ type Conn struct {
rdLocked bool
wr *proto.Writer
InitedAt time.Time
Inited bool
pooled bool
createdAt time.Time
usedAt atomic.Value
}
func NewConn(netConn net.Conn) *Conn {
cn := &Conn{
netConn: netConn,
createdAt: time.Now(),
}
cn.rd = proto.NewReader(netConn)
cn.wr = proto.NewWriter(netConn)

View File

@ -0,0 +1,7 @@
package pool
import "time"
func (cn *Conn) SetCreatedAt(tm time.Time) {
cn.createdAt = tm
}

View File

@ -468,7 +468,7 @@ func (p *ConnPool) isStaleConn(cn *Conn) bool {
if p.opt.IdleTimeout > 0 && now.Sub(cn.UsedAt()) >= p.opt.IdleTimeout {
return true
}
if p.opt.MaxConnAge > 0 && now.Sub(cn.InitedAt) >= p.opt.MaxConnAge {
if p.opt.MaxConnAge > 0 && now.Sub(cn.createdAt) >= p.opt.MaxConnAge {
return true
}

View File

@ -280,7 +280,7 @@ var _ = Describe("conns reaper", func() {
case "idle":
cn.SetUsedAt(time.Now().Add(-2 * idleTimeout))
case "aged":
cn.InitedAt = time.Now().Add(-2 * maxAge)
cn.SetCreatedAt(time.Now().Add(-2 * maxAge))
}
conns = append(conns, cn)
staleConns = append(staleConns, cn)
@ -294,9 +294,6 @@ var _ = Describe("conns reaper", func() {
}
for _, cn := range conns {
if cn.InitedAt.IsZero() {
cn.InitedAt = time.Now()
}
connPool.Put(cn)
}

View File

@ -51,12 +51,11 @@ func (c *baseClient) newConn() (*pool.Conn, error) {
return nil, err
}
if cn.InitedAt.IsZero() {
if err := c.initConn(cn); err != nil {
err = c.initConn(cn)
if err != nil {
_ = c.connPool.CloseConn(cn)
return nil, err
}
}
return cn, nil
}
@ -85,13 +84,11 @@ func (c *baseClient) _getConn() (*pool.Conn, error) {
return nil, err
}
if cn.InitedAt.IsZero() {
err := c.initConn(cn)
err = c.initConn(cn)
if err != nil {
c.connPool.Remove(cn)
return nil, err
}
}
return cn, nil
}
@ -121,7 +118,10 @@ func (c *baseClient) releaseConnStrict(cn *pool.Conn, err error) {
}
func (c *baseClient) initConn(cn *pool.Conn) error {
cn.InitedAt = time.Now()
if cn.Inited {
return nil
}
cn.Inited = true
if c.opt.Password == "" &&
c.opt.DB == 0 &&