diff --git a/internal/pool/pool.go b/internal/pool/pool.go index 2125f3e1..d60edc4b 100644 --- a/internal/pool/pool.go +++ b/internal/pool/pool.go @@ -68,6 +68,7 @@ type Options struct { MaxActiveConns int ConnMaxIdleTime time.Duration ConnMaxLifetime time.Duration + ConnChecker func(net.Conn) error } type lastDialErrorWrap struct { @@ -513,6 +514,12 @@ func (p *ConnPool) isHealthyConn(cn *Conn) bool { return false } + if p.cfg.ConnChecker != nil { + if err := p.cfg.ConnChecker(cn.netConn); err != nil { + return false + } + } + cn.SetUsedAt(now) return true } diff --git a/options.go b/options.go index 8ba74ccd..89934e08 100644 --- a/options.go +++ b/options.go @@ -139,6 +139,9 @@ type Options struct { // Default is to not close idle connections. ConnMaxLifetime time.Duration + // ConnChecker checks the health of a connection before returning it to the client. + ConnChecker func(net.Conn) error + // TLS Config to use. When set, TLS will be negotiated. TLSConfig *tls.Config @@ -523,5 +526,6 @@ func newConnPool( MaxActiveConns: opt.MaxActiveConns, ConnMaxIdleTime: opt.ConnMaxIdleTime, ConnMaxLifetime: opt.ConnMaxLifetime, + ConnChecker: opt.ConnChecker, }) }