diff --git a/TODO.md b/TODO.md index df4bd2a..b4d3919 100644 --- a/TODO.md +++ b/TODO.md @@ -30,17 +30,6 @@ P2: security: per-origin rate limiting # Completed Steps -- 2026-10-15 expired negative cache rows are removed on a schedule (closes - #244): the row of a failed fetch, which makes pixa answer 502 for that source - URL for 5 minutes, was deleted only when the same URL was requested again - after that, so a client asking for a new missing path each time added rows - that stayed for good. The eviction goroutine now calls `CleanExpired` at - startup and on each periodic tick, every 5 minutes in pixad, so a row stays at - most about 10 minutes. `CleanExpired` deletes at most 1000 rows per statement, - so a request waits behind 1000 deletions at most, however many rows have - expired. The goroutine runs with the disk cache disabled - (`cache_max_bytes: 0`) too, where it does nothing else, as the negative cache - is used either way. - 2026-10-15 a transcode stops once its request's `downstream_timeout` has ended, unless it has begun encoding (closes #243): the image processor looked at its context only while it waited for a processing slot, so an image was @@ -59,6 +48,17 @@ P2: security: per-origin rate limiting times and no longer says the work stops when `downstream_timeout` ends. The settings of the WebP, AVIF and JPEG XL encoders, which can hold a slot past the default `downstream_timeout` of 60 seconds, are unchanged. +- 2026-10-15 expired negative cache rows are removed on a schedule (closes + #244): the row of a failed fetch, which makes pixa answer 502 for that source + URL for 5 minutes, was deleted only when the same URL was requested again + after that, so a client asking for a new missing path each time added rows + that stayed for good. The eviction goroutine now calls `CleanExpired` at + startup and on each periodic tick, every 5 minutes in pixad, so a row stays at + most about 10 minutes. `CleanExpired` deletes at most 1000 rows per statement, + so a request waits behind 1000 deletions at most, however many rows have + expired. The goroutine runs with the disk cache disabled + (`cache_max_bytes: 0`) too, where it does nothing else, as the negative cache + is used either way. - 2026-10-15 a cached variant is served while its source URL is in the negative cache (closes #245): `Get` checked the negative cache before the variant cache, so once a fetch of the source failed, as one does when another variant