Fix race condition when saving deployment state during concurrent Azure provisioning #12231
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
During Azure resource provisioning, there's a race condition that causes deployment state corruption when
AzureProvisionerandParameterProcessorsave state concurrently. This results in lost parameter values and the error:Root Cause
Both components follow a load-modify-save pattern without synchronization:
AzureProvisionerloads state:{}ParameterProcessorloads state:{}ParameterProcessorsaves:{"Parameters": {"param1": "value1"}}AzureProvisionersaves:{"Azure": {"SubscriptionId": "...", "Deployments": {...}}}The last write wins, causing
AzureProvisionerto overwrite the parameters saved byParameterProcessor.Solution
This PR implements a merge-on-write pattern in both
UserSecretsDeploymentStateManagerandFileDeploymentStateManager:This ensures concurrent writes from different components preserve each other's data:
Example
Before (Broken):
After (Fixed):
Changes
UserSecretsDeploymentStateManager.cs: AddedMergeJsonObjects()helper and updatedSaveStateAsync()to merge before savingFileDeploymentStateManager.cs: AddedMergeJsonObjects()helper and updatedSaveStateAsync()to merge before savingDefaultUserSecretsManagerTests.cs: Added unit tests validating merge behavior for concurrent savesTesting
Added three unit tests that validate:
Related
Addresses the race condition mentioned in #[issue_number] that remained after changes in #11974.
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
aka.ms/usr/local/bin/bicep build /tmp/aspireFeGNq2/env.module.bicep --stdout(dns block)/usr/local/bin/bicep build /tmp/aspire00YuLv/teststorage.module.bicep --stdout(dns block)/usr/local/bin/bicep build /tmp/aspire8clKI3/env.module.bicep --stdout(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
Fixes #12201
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.