@@ -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