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