in internal/loader/configuration_client_manager.go [185:241]
func (manager *ConfigurationClientManager) DiscoverFallbackClients(ctx context.Context, host string) {
newCtx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
resultChan := make(chan []string)
errChan := make(chan error)
go func() {
srvTargetHosts, err := QuerySrvTargetHost(newCtx, host)
if err != nil {
errChan <- err
} else {
resultChan <- srvTargetHosts
}
close(resultChan)
close(errChan)
}()
select {
case <-newCtx.Done():
klog.Warningf("fail to build fallback clients, SRV DNS lookup is timeout")
break
case err := <-errChan:
klog.Warningf("fail to build fallback clients %s", err.Error())
break
case srvTargetHosts := <-resultChan:
// Shuffle the list of SRV target hosts
for i := range srvTargetHosts {
j := rand.Intn(i + 1)
srvTargetHosts[i], srvTargetHosts[j] = srvTargetHosts[j], srvTargetHosts[i]
}
newDynamicClients := make([]*ConfigurationClientWrapper, 0)
for _, host := range srvTargetHosts {
if isValidEndpoint(host, manager.validDomain) {
targetEndpoint := "https://" + host
if strings.EqualFold(targetEndpoint, manager.endpoint) {
continue
}
client, err := manager.newConfigurationClient(targetEndpoint)
if err != nil {
klog.Warningf("build fallback clients failed, %s", err.Error())
return
}
newDynamicClients = append(newDynamicClients, &ConfigurationClientWrapper{
Endpoint: targetEndpoint,
Client: client,
BackOffEndTime: metav1.Time{},
FailedAttempts: 0,
})
}
}
manager.DynamicClientWrappers = newDynamicClients
manager.lastFallbackClientRefresh = metav1.Now()
break
}
}