diff --git a/TODO.md b/TODO.md index 1173c47..5f22565 100644 --- a/TODO.md +++ b/TODO.md @@ -32,7 +32,8 @@ P2: security: referer blacklist - 2026-09-29 variant content types kept in memory (closes #70): `Cache.metaCache` holds the content types of up to 10,000 variants in an LRU (`github.com/hashicorp/golang-lru/v2`), filled by `StoreVariant` and by - `GetVariant` after it reads a `.meta` file; for a variant it holds, `Lookup` + `GetVariant` after it reads a `.meta` file, where a type `StoreVariant` added + meanwhile is kept over the one read; for a variant it holds, `Lookup` skips the check of the disk and `GetVariant` skips the `.meta` read, still opening the variant file and taking the size from it; eviction removes the entry before deleting the files, and `GetVariant` removes it when the file diff --git a/internal/imgcache/cache.go b/internal/imgcache/cache.go index ad06eb2..43933db 100644 --- a/internal/imgcache/cache.go +++ b/internal/imgcache/cache.go @@ -525,7 +525,10 @@ func (c *Cache) IncrementTransformCount(ctx context.Context) { // loadVariantWithMeta is GetVariant for a variant metaCache does not // hold: it reads the content type from the variant's .meta file and -// keeps it in metaCache. +// keeps it in metaCache, unless a StoreVariant has put one there +// meanwhile. The stored one wins, since this read may have found the +// variant file before the store wrote the .meta file, and so got +// application/octet-stream. func (c *Cache) loadVariantWithMeta( cacheKey VariantKey, ) (io.ReadCloser, int64, string, error) { @@ -534,7 +537,7 @@ func (c *Cache) loadVariantWithMeta( return nil, 0, "", err } - c.metaCache.Add(cacheKey, contentType) + c.metaCache.ContainsOrAdd(cacheKey, contentType) return reader, size, contentType, nil }