func()

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
	}
}