-
Notifications
You must be signed in to change notification settings - Fork 10.5k
Resolve change token leak in Blazor hot reload #53750
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
old change tokens before overwriting. Note that I don't believe the dispose method that was added previously is actually ever called
the hot reload service for disposing the change token. If something goes wrong and this isn't cleared before the next invocation of UpdateEndpoints on the razor data source, clear it and dispose of it then.
MackinnonBuck
approved these changes
Feb 1, 2024
Member
MackinnonBuck
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks great, just a couple small suggestions
src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs
Outdated
Show resolved
Hide resolved
src/Components/Endpoints/src/Builder/RazorComponentEndpointDataSource.cs
Outdated
Show resolved
Hide resolved
MackinnonBuck
pushed a commit
that referenced
this pull request
Feb 9, 2024
Fix of razor hotreload change token leak. This disposes the old change tokens after the ClearCache event or before overwriting. If something goes wrong and this isn't cleared before the next invocation of UpdateEndpoints on the razor data source, clear it and dispose of it then.
10 tasks
wtgodbe
pushed a commit
that referenced
this pull request
Feb 12, 2024
* Resolve change token leak in Blazor hot reload (#53750) Fix of razor hotreload change token leak. This disposes the old change tokens after the ClearCache event or before overwriting. If something goes wrong and this isn't cleared before the next invocation of UpdateEndpoints on the razor data source, clear it and dispose of it then. * Add unit test to confirm change token is disposed during (#53827) * Add unit test to confirm change token is disposed during razer hot reload. * Per Makinnon's feedback, switch to a callback model to create the wrapped disposable for this unit test. * Update src/Components/Endpoints/test/HotReloadServiceTests.cs --------- Co-authored-by: Mackinnon Buck <[email protected]> --------- Co-authored-by: jacdavis <[email protected]>
11 tasks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
The blazor hotreload service and end point data source are leaking change token on each iteration. By the 15th or 20th iteration, dotnet watch begins to slow significantly and quickly starts failing to apply.
There is a clear cache static method that is expected to be implemented by the hot reload extension model. This method was not being implemented for the blazor version of this service. This adds that callback and forwards it to the data source to dispose the last change token in a thread safe manner. Also cleaned up a few other smaller missing dispose calls in this scenario.
Note that I wouldn't normally expose a static event in this way, but these two classes already have this existing pattern. Also, they are both singleton instances that stay alive once created. So I am not unadvising the static event in a dispose method (there is no appropriate time to dispose of either)
Fixes #52757 Hot reload becomes very slow with dotnet watch and Blazor
#52757