Don't await FallbackProjectManager updates #10196
Merged
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.
Back in 17.10p1, the FallbackProjectManager would apply changes to the project snapshot manager without scheduling the updates on the dispatcher. This had the potential to create correctness and reliability problems if those changes collided with other updates that were scheduled on the dispatcher.
To address the correctness problem, I made the FallbackProjectManager async and awaited any updates to the project snapshot manager. However, this created re-entrancy problems that resulted in deadlocks with Roslyn. I fixed a couple of those re-entrancy problems in 17.10p2, but hangs have persisted.
A recent Watson dump revealed another yet another re-entrancy issue with background document promotion in the IRazorDynamicFileInfoProvider. The hang occurs when waiting for the FallbackProjectManager to add the file, which causes the project snapshot manager to notify listeners of the update, which causes one of the listener to try and perform the background document promotion again, which causes the hang.
To address this, I've decided to just "fire-and-forget" the updates to the project snapshot manager. The updates will still happen on the dispatcher, but we won't wait for them and shouldn't hang.