From 7c73f23033187bf357fa03db4e4719ca84b94e9f Mon Sep 17 00:00:00 2001 From: Kiyoshi Nakao Date: Sat, 29 Jun 2024 17:32:01 +0900 Subject: [PATCH 1/2] modify connect() method of connPool to fix connection leak --- proxycore/connpool.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proxycore/connpool.go b/proxycore/connpool.go index 4746de9..3133087 100644 --- a/proxycore/connpool.go +++ b/proxycore/connpool.go @@ -153,17 +153,17 @@ func (p *connPool) connect() (conn *ClientConn, err error) { if errors.Is(err, context.DeadlineExceeded) { return nil, fmt.Errorf("handshake took longer than %s to complete", p.config.ConnectTimeout) } - return nil, err + return conn, err } if version != p.config.Version { p.logger.Error("protocol version not support", zap.Stringer("wanted", p.config.Version), zap.Stringer("got", version)) - return nil, ProtocolNotSupported + return conn, ProtocolNotSupported } if len(p.config.Keyspace) != 0 { err = conn.SetKeyspace(ctx, p.config.Version, p.config.Keyspace) if err != nil { - return nil, err + return conn, err } } From abdbcfdc8c2e3daf3519a77d14aa984713545a85 Mon Sep 17 00:00:00 2001 From: Kiyoshi Nakao Date: Tue, 2 Jul 2024 11:19:21 +0900 Subject: [PATCH 2/2] modify connect method again to avoid returning values --- proxycore/connpool.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/proxycore/connpool.go b/proxycore/connpool.go index 3133087..5e690fa 100644 --- a/proxycore/connpool.go +++ b/proxycore/connpool.go @@ -138,12 +138,13 @@ func (p *connPool) connect() (conn *ClientConn, err error) { PreparedCache: p.preparedCache, Logger: p.logger}) if err != nil { - return nil, err + return } defer func() { if err != nil && conn != nil { _ = conn.Close() + conn = nil } }() @@ -151,24 +152,25 @@ func (p *connPool) connect() (conn *ClientConn, err error) { version, err = conn.Handshake(ctx, p.config.Version, p.config.Auth) if err != nil { if errors.Is(err, context.DeadlineExceeded) { - return nil, fmt.Errorf("handshake took longer than %s to complete", p.config.ConnectTimeout) + err = fmt.Errorf("handshake took longer than %s to complete", p.config.ConnectTimeout) } - return conn, err + return } if version != p.config.Version { p.logger.Error("protocol version not support", zap.Stringer("wanted", p.config.Version), zap.Stringer("got", version)) - return conn, ProtocolNotSupported + err = ProtocolNotSupported + return } if len(p.config.Keyspace) != 0 { err = conn.SetKeyspace(ctx, p.config.Version, p.config.Keyspace) if err != nil { - return conn, err + return } } go conn.Heartbeats(p.config.ConnectTimeout, p.config.Version, p.config.HeartBeatInterval, p.config.IdleTimeout, p.logger) - return conn, nil + return } // stayConnected will attempt to reestablish a disconnected (`connection == nil`) connection within the pool. Reconnect attempts