func()

in internal/loader/configuration_setting_loader.go [523:583]


func (csl *ConfigurationSettingLoader) ExecuteFailoverPolicy(ctx context.Context, settingsClient SettingsClient) (*SettingsResponse, error) {
	clients, err := csl.ClientManager.GetClients(ctx)
	if err != nil {
		return nil, err
	}

	if len(clients) == 0 {
		csl.ClientManager.RefreshClients(ctx)
		return nil, fmt.Errorf("no client is available to connect to the target App Configuration store")
	}

	manager, ok := csl.ClientManager.(*ConfigurationClientManager)
	if csl.AzureAppConfigurationProvider.Spec.LoadBalancingEnabled && ok && manager.lastSuccessfulEndpoint != "" && len(clients) > 1 {
		nextClientIndex := 0
		for _, clientWrapper := range clients {
			nextClientIndex++
			if clientWrapper.Endpoint == manager.lastSuccessfulEndpoint {
				break
			}
		}

		// If we found the last successful client,we'll rotate the list so that the next client is at the beginning
		if nextClientIndex < len(clients) {
			rotate(clients, nextClientIndex)
		}
	}

	errors := make([]error, 0)
	var tracingEnabled, isFailoverRequest bool
	if value, ok := os.LookupEnv(RequestTracingEnabled); ok {
		tracingEnabled, _ = strconv.ParseBool(value)
	}
	for _, clientWrapper := range clients {
		if tracingEnabled {
			ctx = policy.WithHTTPHeader(ctx, createCorrelationContextHeader(ctx, csl.AzureAppConfigurationProvider, csl.ClientManager, isFailoverRequest))
		}
		settingsResponse, err := settingsClient.GetSettings(ctx, clientWrapper.Client)
		successful := true
		if err != nil {
			successful = false
			updateClientBackoffStatus(clientWrapper, successful)
			if IsFailoverable(err) {
				klog.Warningf("current client of '%s' failed to get settings: %s", clientWrapper.Endpoint, err.Error())
				errors = append(errors, err)
				isFailoverRequest = true
				continue
			}
			return nil, err
		}

		if manager, ok := csl.ClientManager.(*ConfigurationClientManager); ok {
			manager.lastSuccessfulEndpoint = clientWrapper.Endpoint
		}
		updateClientBackoffStatus(clientWrapper, successful)
		return settingsResponse, nil
	}

	// Failed to execute failover policy
	csl.ClientManager.RefreshClients(ctx)
	return nil, fmt.Errorf("all app configuration clients failed to get settings: %v", errors)
}