Skip to content

Commit 39ebf85

Browse files
Fix cache resolution
1 parent 5dcae69 commit 39ebf85

File tree

1 file changed

+33
-22
lines changed

1 file changed

+33
-22
lines changed

src/ImageSharp.Web/Middleware/ImageSharpMiddleware.cs

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -372,35 +372,46 @@ private async Task<ValueTuple<bool, ImageMetadata>> IsNewOrUpdatedAsync(
372372
{
373373
using (await AsyncLock.ReaderLockAsync(key))
374374
{
375-
ImageMetadata sourceImageMetadata = default;
375+
// Get the source metadata for processing, storing the result for future checks.
376+
ImageMetadata sourceImageMetadata = await
377+
SourceMetadataLru.GetOrAddAsync(
378+
key,
379+
_ => sourceImageResolver.GetMetaDataAsync());
376380

377381
// Check to see if the cache contains this image.
378-
IImageCacheResolver cachedImageResolver
379-
= await CacheResolverLru.GetOrAddAsync(key, async k => await this.cache.GetAsync(k));
382+
// If not, we return early. No further checks necessary.
383+
IImageCacheResolver cachedImageResolver = await
384+
CacheResolverLru.GetOrAddAsync(
385+
key,
386+
k => this.cache.GetAsync(k));
380387

381-
if (cachedImageResolver != null)
388+
if (cachedImageResolver is null)
382389
{
383-
ImageCacheMetadata cachedImageMetadata =
384-
await CacheMetadataLru.GetOrAddAsync(key, async _ => await cachedImageResolver.GetMetaDataAsync());
385-
386-
if (cachedImageMetadata != default)
387-
{
388-
// Has the cached image expired or has the source image been updated?
389-
sourceImageMetadata =
390-
await SourceMetadataLru.GetOrAddAsync(key, async _ => await sourceImageResolver.GetMetaDataAsync());
390+
// Remove the null resolver from the store.
391+
CacheResolverLru.TryRemove(key);
392+
return (true, sourceImageMetadata);
393+
}
391394

392-
if (cachedImageMetadata.SourceLastWriteTimeUtc == sourceImageMetadata.LastWriteTimeUtc
393-
&& cachedImageMetadata.ContentLength > 0 // Fix for old cache without length property
394-
&& cachedImageMetadata.CacheLastWriteTimeUtc > (DateTimeOffset.UtcNow - this.options.CacheMaxAge))
395-
{
396-
// We're pulling the image from the cache.
397-
await this.SendResponseAsync(imageContext, key, cachedImageMetadata, null, cachedImageResolver);
398-
return (false, sourceImageMetadata);
399-
}
400-
}
395+
// Now resolve the cached image metadata storing the result.
396+
ImageCacheMetadata cachedImageMetadata = await
397+
CacheMetadataLru.GetOrAddAsync(
398+
key,
399+
_ => cachedImageResolver.GetMetaDataAsync());
400+
401+
// Has the cached image expired?
402+
// Or has the source image changed since the image was last cached?
403+
if (cachedImageMetadata.ContentLength == 0 // Fix for old cache without length property
404+
|| cachedImageMetadata.CacheLastWriteTimeUtc <= (DateTimeOffset.UtcNow - this.options.CacheMaxAge)
405+
|| cachedImageMetadata.SourceLastWriteTimeUtc != sourceImageMetadata.LastWriteTimeUtc)
406+
{
407+
// We want to remove the metadata from the store so that the next check gets the updated file.
408+
CacheMetadataLru.TryRemove(key);
409+
return (true, sourceImageMetadata);
401410
}
402411

403-
return (true, sourceImageMetadata);
412+
// We're pulling the image from the cache.
413+
await this.SendResponseAsync(imageContext, key, cachedImageMetadata, null, cachedImageResolver);
414+
return (false, sourceImageMetadata);
404415
}
405416
}
406417

0 commit comments

Comments
 (0)