@@ -106,19 +106,23 @@ func (p *ConnPool) NewConn() (*Conn, error) {
106
106
}
107
107
108
108
func (p * ConnPool ) PopFree () * Conn {
109
- timer := timers .Get ().(* time.Timer )
110
- timer .Reset (p .poolTimeout )
111
-
112
109
select {
113
110
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
116
125
}
117
- timers .Put (timer )
118
- case <- timer .C :
119
- timers .Put (timer )
120
- atomic .AddUint32 (& p .stats .Timeouts , 1 )
121
- return nil
122
126
}
123
127
124
128
p .freeConnsMu .Lock ()
@@ -150,19 +154,23 @@ func (p *ConnPool) Get() (*Conn, bool, error) {
150
154
151
155
atomic .AddUint32 (& p .stats .Requests , 1 )
152
156
153
- timer := timers .Get ().(* time.Timer )
154
- timer .Reset (p .poolTimeout )
155
-
156
157
select {
157
158
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
160
173
}
161
- timers .Put (timer )
162
- case <- timer .C :
163
- timers .Put (timer )
164
- atomic .AddUint32 (& p .stats .Timeouts , 1 )
165
- return nil , false , ErrPoolTimeout
166
174
}
167
175
168
176
for {
0 commit comments