FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException - #126093

Merged
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked
Jul 27, 2026
Merged

FileConfigurationProvider: Handle and forward IO exceptions to OnLoadException#126093
mrek-msft merged 35 commits into
dotnet:mainfrom
mrek-msft:dev/mrek/mefs-filecfgprov-reload-locked

Conversation

@mrek-msft

@mrek-msftmrek-msft commented Mar 25, 2026

Copy link
Copy Markdown
Member

Current behavior of FileConfigurationProvider on various types of failures at various times:

First LoadOnChange Reload
data parsing failureOnLoadException callback is called
AddJsonFile throws

OnLoadException callback is called
program continues
no reload happen
IO failure on file openAddJsonFile throwsSilent
program continues
no reload happen
possibly raises UnobservedTaskException later

This PR unifies it in a way that both types of failure behave same as data parsing failure.

This brings some behavioral changes

  • OnLoadException callback is newly triggered if IO error happen on both types of events (first load, reload)
  • UnobservedTaskException can no longer be observed in scenario when user registers OnLoadException callback. It can however happen when no callback is registered, so XML comment on OnLoadException was updated.
  • OnLoadException callbacks now receives not only InvalidDataException, but also IOException (or any other exception which (possibly custom) implementation of IFileProvider can throw). If user cast to InvalidDataException, he may miss other exceptions or get cast exceptions.

Based on follow up Copilot code reviews, I did few more behavior changes at edge cases, they do not relate directly to issue and can be reverted independently if not desired.

  • OnReload() now fires only when Data actually changed. Previously on first load, if a parse or IO error occurred and OnLoadException set Ignore = true, OnReload() was fired unconditionally even though Data was never modified. The new code fires OnReload() only when Data was successfully loaded or explicitly cleared (e.g., on reload or optional missing file). For consecutive reloads with parse errors, Data is cleared and OnReload() still fires. This change is independent on original fix and can be reverted independently if not desirable.

Fix#113964

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Unifies FileConfigurationProvider failure handling so IO failures during file open are handled the same way as parsing failures with respect to OnLoadException (including on reload-on-change), preventing unobserved/unhandled exceptions like the one reported in #113964.

Changes:

  • Moves stream opening (OpenRead) inside the exception-handling region so IO errors are routed through HandleException/OnLoadException.
  • Adds an inner try/catch to wrap exceptions thrown by Load(stream) in an InvalidDataException with the standard “Failed to load…” message.
  • Adjusts the outer catch to forward the exception through HandleException (enabling ignore behavior on reload).

@mrek-msft
mrek-msft marked this pull request as draft March 25, 2026 15:36
CopilotAI review requested due to automatic review settings March 26, 2026 16:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

CopilotAI review requested due to automatic review settings March 26, 2026 16:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

CopilotAI review requested due to automatic review settings March 27, 2026 10:48

@tarekghtarekgh left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Left minor comments I hope you address them. LGTM, otherwise.

@mrek-msft
mrek-msft marked this pull request as draft May 14, 2026 12:12
@mrek-msft
mrek-msft marked this pull request as ready for review July 27, 2026 14:11
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@mrek-msftmrek-msft added the breaking-change Issue or PR that represents a breaking API or functional change over a previous release. label Jul 27, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
@dotnet-policy-service

dotnet-policy-serviceBot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Added needs-breaking-change-doc-created label because this PR has the breaking-change label.

When you commit this breaking change:

  1. Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the breaking change documentation template, then remove this needs-breaking-change-doc-created label.
  2. Ask a committer to mail the .NET Breaking Change Notification DL.

Tagging @dotnet/compat for awareness of the breaking change.

@mrek-msft

Copy link
Copy Markdown
MemberAuthor

/backport to release/11.0-preview7

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/11.0-preview7 (link to workflow run)

@github-actions

Copy link
Copy Markdown
Contributor

@mrek-msft backporting to release/11.0-preview7 failed, the patch most likely resulted in conflicts. Please backport manually!

git am output
$ git am --3way --empty=keep --ignore-whitespace --keep-non-patch changes.patchApplying: Forward IO exceptions to OnLoadExceptionApplying: Removed duplicate Data dict recreationApplying: Add testsApplying: Throw alaways InvalidDataException and clear Data only on data error.Applying: Improve test attributes assignment.Applying: Fix typosApplying: Change exception back to rpopagating IOException directly and improve file path formatting logic.Applying: Fix missing PhysicalPath in error string shown file name selectionApplying: Improve comment.Applying: Remove duplicate test.Applying: Add missing ActiveIssue attribute to possibly flaky test.Applying: Add comment recommended by CopilotApplying: Check for type of observed exception.Applying: Dispose IConfigurationRootApplying: Update comment and its location based on Copilot hintsApplying: Do not fire OnReload if no Data change happened.Applying: Add checking config value after faulty reloadApplying: Move and improve comment.Applying: Fix double empty lineApplying: Add docs mentioning consequences of not registering OnLoadException.Applying: Improve test coverage to handle Copilot discovered edge casesApplying: exclude IOException from handling on "parse error" path.Applying: Improve commentApplying: Improve commentApplying: Fix comment grammarApplying: Improve FileLoadExceptionContext.Exception comment as requested in PR reviewApplying: Removal of nested try..catch and handling deletion explicitlyApplying: Handle file not found in the same way on both paths.Applying: Fix whitespace formattingApplying: Copilot improved commentApplying: Removed old commentApplying: Fix typo in commentApplying: Propagate DirectoryNotFoundException properly.error: sha1 information is lacking or useless (src/libraries/Microsoft.Extensions.Configuration.FileExtensions/src/FileConfigurationProvider.cs).error: could not build fake ancestorhint: Use 'git am --show-current-patch=diff' to see the failed patchhint: When you have resolved this problem, run "git am --continue".hint: If you prefer to skip this patch, run "git am --skip" instead.hint: To restore the original branch and stop patching, run "git am --abort".hint: Disable this message with "git config set advice.mergeConflict false"Patch failed at 0033 Propagate DirectoryNotFoundException properly.Error: The process '/usr/bin/git' failed with exit code 128

Link to workflow output

@mrek-msftmrek-msft removed the needs-breaking-change-doc-created Breaking changes need an issue opened with https://github.com/dotnet/docs/issues/new?template=dotnet label Jul 27, 2026
mrek-msft added a commit that referenced this pull request Jul 27, 2026
… IO exceptions to OnLoadException (#131427)
Backport of #126093 to release/11.0-preview7
## Customer Impact
Long standing issue reported by customer
- [X] Customer reported
- [ ] Found internally
## Regression
Long standing issue.
- [ ] Yes
- [X] No
## Testing
6 tests were added.
## Risk
Low. It is backport to Preview 7 version after branch were snapped but
before code complete.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@dotnet-milestone-botdotnet-milestone-botBot modified the milestones: 11.0.0, 11.0-rc1Jul 28, 2026
rosebyte pushed a commit to rosebyte/dotnet-runtime that referenced this pull request Jul 30, 2026
Resolves the conflict in ConfigurationTests.cs caused by dotnet#126093, which
added six OnLoadException tests immediately after ReloadOnChangeWorksAfterError
and removed OnLoadErrorCanIgnoreErrors.
Both sides kept:
- upstream's six new tests, with their [ActiveIssue]/[PlatformSpecific]
attributes untouched;
- this branch's [SkipOnPlatform] guard on TouchingFileWillReload, replacing
the [ActiveIssue] quarantine it carried on main.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 21a523e1-0a42-4c98-b0a0-9850b1c3c03b
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 27, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Extensions-FileSystembreaking-changeIssue or PR that represents a breaking API or functional change over a previous release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unhandled exception from FileConfigurationProvider when re-loading a locked file

6 participants

@mrek-msft@svick@tarekgh@rosebyte@cincuranet