Skip to content

Commit 1ec930f

Browse files
authored
Merge pull request #586 from go-redis/fix/pool-fast-path
pool: add fast path
2 parents 117fed9 + 3ad186c commit 1ec930f

File tree

1 file changed

+28
-20
lines changed

1 file changed

+28
-20
lines changed

internal/pool/pool.go

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,23 @@ func (p *ConnPool) NewConn() (*Conn, error) {
106106
}
107107

108108
func (p *ConnPool) PopFree() *Conn {
109-
timer := timers.Get().(*time.Timer)
110-
timer.Reset(p.poolTimeout)
111-
112109
select {
113110
case p.queue <- struct{}{}:
114-
if !timer.Stop() {
115-
<-timer.C
111+
default:
112+
timer := timers.Get().(*time.Timer)
113+
timer.Reset(p.poolTimeout)
114+
115+
select {
116+
case p.queue <- struct{}{}:
117+
if !timer.Stop() {
118+
<-timer.C
119+
}
120+
timers.Put(timer)
121+
case <-timer.C:
122+
timers.Put(timer)
123+
atomic.AddUint32(&p.stats.Timeouts, 1)
124+
return nil
116125
}
117-
timers.Put(timer)
118-
case <-timer.C:
119-
timers.Put(timer)
120-
atomic.AddUint32(&p.stats.Timeouts, 1)
121-
return nil
122126
}
123127

124128
p.freeConnsMu.Lock()
@@ -150,19 +154,23 @@ func (p *ConnPool) Get() (*Conn, bool, error) {
150154

151155
atomic.AddUint32(&p.stats.Requests, 1)
152156

153-
timer := timers.Get().(*time.Timer)
154-
timer.Reset(p.poolTimeout)
155-
156157
select {
157158
case p.queue <- struct{}{}:
158-
if !timer.Stop() {
159-
<-timer.C
159+
default:
160+
timer := timers.Get().(*time.Timer)
161+
timer.Reset(p.poolTimeout)
162+
163+
select {
164+
case p.queue <- struct{}{}:
165+
if !timer.Stop() {
166+
<-timer.C
167+
}
168+
timers.Put(timer)
169+
case <-timer.C:
170+
timers.Put(timer)
171+
atomic.AddUint32(&p.stats.Timeouts, 1)
172+
return nil, false, ErrPoolTimeout
160173
}
161-
timers.Put(timer)
162-
case <-timer.C:
163-
timers.Put(timer)
164-
atomic.AddUint32(&p.stats.Timeouts, 1)
165-
return nil, false, ErrPoolTimeout
166174
}
167175

168176
for {

0 commit comments

Comments
 (0)