in grpcgcp/gcp_balancer.go [355:379]
func (gb *gcpBalancer) getReadySubConnRef(boundKey string) (*subConnRef, bool) {
gb.mu.Lock()
defer gb.mu.Unlock()
if sc, ok := gb.affinityMap[boundKey]; ok {
if gb.scStates[sc] != connectivity.Ready {
// It's possible that the bound subconn is not in the readySubConns list,
// If it's not ready, we throw ErrNoSubConnAvailable or
// fallback to a previously mapped ready subconn or the least busy.
if gb.cfg.GetChannelPool().GetFallbackToReady() {
if sc, ok := gb.fallbackMap[boundKey]; ok {
return gb.scRefs[sc], true
}
// Try to create fallback mapping.
if scRef, err := gb.picker.(*gcpPicker).getLeastBusySubConnRef(); err == nil {
gb.fallbackMap[boundKey] = scRef.subConn
return scRef, true
}
}
return nil, true
}
return gb.scRefs[sc], true
}
return nil, false
}