in gdbclient/internal/pool/pool.go [339:373]
func (p *ConnPool) waitForConn(timeout time.Duration) (*ConnWebSocket, error) {
endtime := time.Now().Add(timeout)
for remaining := timeout; remaining > 0; remaining = endtime.Sub(time.Now()) {
internal.Logger.Debug("wait conn", zap.Time("now", time.Now()), zap.Duration("timeout", remaining))
ok := p.awaitAvailableConn(remaining)
if !ok {
internal.Logger.Debug("wait conn timeout", zap.Time("time", time.Now()))
return nil, errGetConnTimeout
}
if p.closed() {
internal.Logger.Debug("wait conn failed as pool closed")
return nil, errPoolClosed
}
conn := p.selectLeastUsed()
for conn != nil {
inFlight := atomic.LoadInt32(&conn.borrowed)
available := conn.availableInProcess()
// FIXME: connection available
// break to wait again if inFlight >= available in Java SDK
// why do set to wait again if connection available, so typo it now
if available == 0 {
internal.Logger.Info("wait conn may timeout", zapPtr(conn),
zap.Int32("inFlight", inFlight), zap.Int32("availableInProcess", available))
break
}
if atomic.CompareAndSwapInt32(&conn.borrowed, inFlight, inFlight+1) {
return conn, nil
}
}
}
return nil, errGetConnTimeout
}