diff --git a/pool.go b/pool.go index 7031a45f..8a99e3ad 100644 --- a/pool.go +++ b/pool.go @@ -116,7 +116,10 @@ func newConnPool(dial func() (*conn, error), opt *options) *connPool { func (p *connPool) new() (*conn, error) { select { - case <-p.rl.C: + case _, ok := <-p.rl.C: + if !ok { + return nil, errClosed + } default: return nil, errRateLimited } @@ -260,6 +263,7 @@ func (p *connPool) Close() error { return nil } p.closed = true + close(p.rl.C) var retErr error for { e := p.conns.Front() diff --git a/rate_limit.go b/rate_limit.go index bd84a241..2534ddc4 100644 --- a/rate_limit.go +++ b/rate_limit.go @@ -20,6 +20,9 @@ func newRateLimiter(limit time.Duration, chanSize int) *rateLimiter { } func (rl *rateLimiter) loop(limit time.Duration) { + defer func() { + recover() + }() for { select { case rl.C <- struct{}{}: