Skip to content

App Config Provider Cleanup#49026

Open
mrm9084 wants to merge 6 commits intoAzure:mainfrom
mrm9084:AppConfigCodeCleanup
Open

App Config Provider Cleanup#49026
mrm9084 wants to merge 6 commits intoAzure:mainfrom
mrm9084:AppConfigCodeCleanup

Conversation

@mrm9084
Copy link
Copy Markdown
Member

@mrm9084 mrm9084 commented May 2, 2026

Description

There is a number of issues that have built up over time that this pr fixes.

  • Turns a few Boolean into boolean
  • Various spelling fixes.
  • Feature Flags and Configuration settings had identical code for page based etags, but used their own methods.
  • Replica lookup could result previous in a semaphore not releasing.
  • Replica Lookup just looked and didn't sleep between checks.
  • Removed some unsured code from old releases.
  • Fixed some JavaDocs
  • Fixed the backoff calculation minBackoffNano was added twice.
  • Refactored client builder
  • Fixed a bug where invalid feature flags would result in a null feature flag being added to the configurations.

Copilot AI review requested due to automatic review settings May 2, 2026 00:06
@github-actions github-actions Bot added the azure-spring All azure-spring related issues label May 2, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR performs a broad cleanup/refactor of the Spring Cloud Azure App Configuration provider implementation, consolidating duplicated listing logic, tightening concurrency/backoff behavior, improving immutability, and fixing a handful of correctness and documentation issues.

Changes:

  • Consolidates settings/feature-flag paging into a single page-based listing path (listSettingsByPage) and updates callers/tests accordingly.
  • Fixes and hardens replica discovery/backoff/refresh behavior (semaphore release safety, retry sleep, backoff calculation fix, null-safety).
  • Improves maintainability via immutability, primitive boolean/int usage, safer label handling, and corrected JavaDocs/spelling/logging.

Reviewed changes

Copilot reviewed 29 out of 29 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClient.java Renames/centralizes page-based settings listing; removes duplicated feature-flag listing; improves error handling for watch checks.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClientsBuilder.java Refactors client construction paths (endpoints vs connection strings), adds safer connection-string handling/redaction, and clarifies retry configuration.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/autofailover/ReplicaLookUp.java Makes replica discovery more robust (concurrency-safe maps, semaphore release in finally, sleep between DNS retries, cleaner flow).
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/autofailover/SRVRecord.java Implements Comparable, fixes protocol constant spelling, and updates SRV ordering logic.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/FeatureFlagClient.java Uses listSettingsByPage, fixes context propagation for tracing, avoids inserting null features, and reuses mapper.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/BackoffTimeCalculator.java Fixes backoff calculation (removes double-add of min backoff).
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationProperties.java Simplifies duplicate-endpoint detection using a Set.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/configuration/WatchedConfigurationSettings.java Makes settings container immutable by removing setters and finalizing fields.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/State.java Makes refresh attempt tracking immutable (new State created per increment).
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/ConnectionManager.java Simplifies available-client filtering and adds null-safety in backoff updates.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationRefreshUtil.java Uses primitive boolean and adjusts feature-flag refresh logic flow.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClientFactory.java Removes static global connection map in favor of instance state.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/stores/AppConfigurationSecretClientManager.java Replaces instance timeout field with constant and aligns JavaDoc.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagStore.java Switches to primitives and simplifies empty-checks.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/FeatureFlagKeyValueSelector.java Avoids mutating incoming profiles list and uses safer label array creation.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/properties/AppConfigurationKeyValueSelector.java Uses safer toArray overload and cleans imports/formatting.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationApplicationSettingPropertySource.java Avoids mutating label array view and replaces regex-based trimming with substring logic.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigDataLoader.java Updates to use the consolidated page-based listing method.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigDataLocationResolver.java Uses primitive boolean for enablement check.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AzureAppConfigBootstrapRegistrar.java Removes redundant customizer application (handled via factory customization).
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationSnapshotPropertySource.java Updates renamed feature-flag processing method call.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/StateHolder.java Switches to primitives and removes an unnecessary cast.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/main/java/com/azure/spring/cloud/appconfiguration/config/implementation/feature/entity/Feature.java Corrects constructor JavaDoc parameter descriptions.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClientTest.java Updates tests to the consolidated listSettingsByPage path.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/FeatureFlagClientTest.java Updates mocks to use listSettingsByPage and simplifies context usage.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/autofailover/SRVRecordTest.java Updates expectations to match new SRV ordering behavior.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/AppConfigurationReplicaClientBuilderTest.java Aligns assertions with updated connection-string parsing/error messaging.
sdk/spring/spring-cloud-azure-appconfiguration-config/src/test/java/com/azure/spring/cloud/appconfiguration/config/implementation/stores/ConfigStoreTest.java Import/format cleanup only.

Comment on lines +137 to 144
if (!existingEndpoints.add(endpoint)) {
throw new IllegalArgumentException("Duplicate store name exists.");
}
existingEndpoints.put(endpoint, true);
}
} else if (StringUtils.hasText(store.getEndpoint())) {
if (existingEndpoints.containsKey(store.getEndpoint())) {
if (!existingEndpoints.add(store.getEndpoint())) {
throw new IllegalArgumentException("Duplicate store name exists.");
}
Comment on lines +216 to +228
private AppConfigurationReplicaClient buildClientFromEndpoint(String endpoint, String originEndpoint,
DefaultAzureCredential sharedCredential) {
ConfigurationClientBuilder builder = createBuilderInstance();
// When credentialConfigured is false, no credential was provided via Spring Cloud Azure
// auto-config, so we fall back to DefaultAzureCredential. Prefer the shared instance
// when available; create a new one only for single-endpoint failover calls (null passed in).
if (!credentialConfigured) {
builder.credential(sharedCredential != null ? sharedCredential
: new DefaultAzureCredentialBuilder().build());
}
builder.endpoint(endpoint);
return modifyAndBuildClient(builder, endpoint, originEndpoint, 0);
}
records.put(mainEndpoint, srvRecords);
wait.put(mainEndpoint, Instant.now().plus(FALLBACK_CLIENT_REFRESH_EXPIRED_INTERVAL));
} catch (AppConfigurationReplicaException e) {
LOGGER.warn("Failed to find replicas due to: " + e.getMessage());
Comment on lines +224 to +228
: new DefaultAzureCredentialBuilder().build());
}
builder.endpoint(endpoint);
return modifyAndBuildClient(builder, endpoint, originEndpoint, 0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

azure-spring All azure-spring related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants