fix(Caching): Correct Cancellation Handling #451
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.
Where the request being processed via the read through cache mechanism gets
Cancelled
(viaCancellationTokenSource
, but also via things likeAsync.Parallel
's cancellation of sibling requests), theTask
held within theLazyTask
ends up inCancelled
state, not the more typicalIsFaulted
.This leads to incorrect re-use of the cached value (as held within the cell).
This in turn leads to any request with
AnyCachedValue
(orAllowStale
) in4.0.0
failing withTaskCancelledException
for as long as that cache entry lives.While this is a relatively obvious mistake, the issue is only reproducable with very heavy parallism - and it's only in cache read through mode (
allowStale > TimeSpan.Zero
) that this comes into play.