From d8227214bc7927ac399fa7600a8765df75c8071c Mon Sep 17 00:00:00 2001 From: Nikolay Vorobev Date: Wed, 1 Nov 2023 16:55:42 +0300 Subject: [PATCH] newConn race fix --- internal/pool/pool.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/pool/pool.go b/internal/pool/pool.go index 55ca1719..1fe671d9 100644 --- a/internal/pool/pool.go +++ b/internal/pool/pool.go @@ -164,6 +164,18 @@ func (p *ConnPool) NewConn(ctx context.Context) (*Conn, error) { } func (p *ConnPool) newConn(ctx context.Context, pooled bool) (*Conn, error) { + var poolExhausted bool + + p.connsMu.Lock() + if p.cfg.MaxActiveConns > 0 { + poolExhausted = p.poolSize >= p.cfg.MaxActiveConns + } + p.connsMu.Unlock() + + if poolExhausted { + return nil, ErrPoolExhausted + } + cn, err := p.dialConn(ctx, pooled) if err != nil { return nil, err @@ -178,12 +190,6 @@ func (p *ConnPool) newConn(ctx context.Context, pooled bool) (*Conn, error) { return nil, ErrClosed } - // It is not allowed to add new connections to the connection pool. - if p.cfg.MaxActiveConns > 0 && p.poolSize >= p.cfg.MaxActiveConns { - _ = cn.Close() - return nil, ErrPoolExhausted - } - p.conns = append(p.conns, cn) if pooled { // If pool is full remove the cn on next Put.