From a43bba2eb99e05ba29fb9f77bf37506a444787ff Mon Sep 17 00:00:00 2001 From: Mykhailo Faraponov Date: Fri, 28 Nov 2025 20:59:18 +0100 Subject: [PATCH] fix: skip releasing if tryDeliver succeeds --- internal/pool/pool.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/internal/pool/pool.go b/internal/pool/pool.go index 184321c18..a4f1f1979 100644 --- a/internal/pool/pool.go +++ b/internal/pool/pool.go @@ -569,8 +569,9 @@ func (p *ConnPool) queuedNewConn(ctx context.Context) (*Conn, error) { defer func() { if err != nil { if cn := w.cancel(); cn != nil { - p.putIdleConn(ctx, cn) - p.freeTurn() + if p.putIdleConn(ctx, cn) { + p.freeTurn() + } } } }() @@ -597,9 +598,10 @@ func (p *ConnPool) queuedNewConn(ctx context.Context) (*Conn, error) { if cnErr == nil && delivered { return } else if cnErr == nil && !delivered { - p.putIdleConn(dialCtx, cn) - p.freeTurn() - freeTurnCalled = true + if p.putIdleConn(dialCtx, cn) { + p.freeTurn() + freeTurnCalled = true + } } else { p.freeTurn() freeTurnCalled = true @@ -616,14 +618,14 @@ func (p *ConnPool) queuedNewConn(ctx context.Context) (*Conn, error) { } } -func (p *ConnPool) putIdleConn(ctx context.Context, cn *Conn) { +func (p *ConnPool) putIdleConn(_ context.Context, cn *Conn) bool { for { w, ok := p.dialsQueue.dequeue() if !ok { break } if w.tryDeliver(cn, nil) { - return + return false } } @@ -632,12 +634,13 @@ func (p *ConnPool) putIdleConn(ctx context.Context, cn *Conn) { if p.closed() { _ = cn.Close() - return + return true } // poolSize is increased in newConn p.idleConns = append(p.idleConns, cn) p.idleConnsLen.Add(1) + return true } func (p *ConnPool) waitTurn(ctx context.Context) error {