in grpcgcp/gcp_picker.go [189:217]
func (p *gcpPicker) getLeastBusySubConnRef() (*subConnRef, error) {
minScRef := p.scRefs[0]
minStreamsCnt := minScRef.getStreamsCnt()
for _, scRef := range p.scRefs {
if scRef.getStreamsCnt() < minStreamsCnt {
minStreamsCnt = scRef.getStreamsCnt()
minScRef = scRef
}
}
// If the least busy connection still has capacity, use it
if minStreamsCnt < int32(p.gb.cfg.GetChannelPool().GetMaxConcurrentStreamsLowWatermark()) {
return minScRef, nil
}
if p.gb.cfg.GetChannelPool().GetMaxSize() == 0 || p.gb.getConnectionPoolSize() < int(p.gb.cfg.GetChannelPool().GetMaxSize()) {
// Ask balancer to create new subconn when all current subconns are busy and
// the connection pool still has capacity (either unlimited or maxSize is not reached).
p.gb.newSubConn()
// Let this picker return ErrNoSubConnAvailable because it needs some time
// for the subconn to be READY.
return nil, balancer.ErrNoSubConnAvailable
}
// If no capacity for the pool size and every connection reachs the soft limit,
// Then picks the least busy one anyway.
return minScRef, nil
}