Skip to content

Conversation

@jacdavis
Copy link
Contributor

@jacdavis jacdavis commented Feb 1, 2024

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

captainsafia and others added 4 commits January 30, 2024 16:37
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.
@jacdavis jacdavis requested a review from a team as a code owner February 1, 2024 00:24
@ghost ghost added the area-blazor Includes: Blazor, Razor Components label Feb 1, 2024
Copy link
Member

@MackinnonBuck MackinnonBuck left a 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

@jacdavis jacdavis merged commit 29f59f5 into main Feb 1, 2024
@jacdavis jacdavis deleted the jacdavis/hot-reload-blazor branch February 1, 2024 21:49
@ghost ghost added this to the 9.0-preview2 milestone Feb 1, 2024
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.
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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-blazor Includes: Blazor, Razor Components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hot reload becomes very slow with dotnet watch and Blazor

4 participants