diff --git a/internal/pool/pool.go b/internal/pool/pool.go index cabcba1b..f0cb5197 100644 --- a/internal/pool/pool.go +++ b/internal/pool/pool.go @@ -60,13 +60,16 @@ type Options struct { IdleCheckFrequency time.Duration } +type lastDialErrorWrap struct { + err error +} + type ConnPool struct { opt *Options dialErrorsNum uint32 // atomic - lastDialErrorMu sync.RWMutex - lastDialError error + lastDialError atomic.Value queue chan struct{} @@ -204,16 +207,15 @@ func (p *ConnPool) tryDial() { } func (p *ConnPool) setLastDialError(err error) { - p.lastDialErrorMu.Lock() - p.lastDialError = err - p.lastDialErrorMu.Unlock() + p.lastDialError.Store(&lastDialErrorWrap{err: err}) } func (p *ConnPool) getLastDialError() error { - p.lastDialErrorMu.RLock() - err := p.lastDialError - p.lastDialErrorMu.RUnlock() - return err + err, _ := p.lastDialError.Load().(*lastDialErrorWrap) + if err != nil { + return err.err + } + return nil } // Get returns existed connection from the pool or creates a new one.