diff --git a/TODO.md b/TODO.md index 813b5ab..ec06a81 100644 --- a/TODO.md +++ b/TODO.md @@ -30,6 +30,24 @@ P2: security: per-origin rate limiting # Completed Steps +- 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 + decoded and encoded, holding the slot, however long after its request's + deadline that took. `Process` now returns the context's error, and gives the + slot back, when the context has ended by the time it has the slot or before it + encodes. A request that waited for a shared transcode stopped at the first + request's deadline is answered 503 `server busy, try again later`, not 500, + though its own `downstream_timeout` may not have ended. govips gives pixa no + way to stop libvips once an encode has begun, so that encode keeps its slot + until it finishes; the limit of 8192 on each side of the source and of the + output bounds how long that takes. With one libvips thread, 8192x8192 random + pixels take up to about 1 second to encode as JPEG, 15 as PNG, 16 as GIF, 63 + as WebP, 110 as AVIF and 96 as JPEG XL, the last three with an alpha channel, + plus up to about 11 seconds to decode the source; `README.md` gives these + 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 "Running under upaas" in `README.md` tells the operator to set `PIXA_CACHE_MAX_BYTES` (closes #251): it listed the variable as optional, but under upaas the volume is a directory on the host's filesystem. The default, @@ -57,24 +75,6 @@ P2: security: per-origin rate limiting 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 - decoded and encoded, holding the slot, however long after its request's - deadline that took. `Process` now returns the context's error, and gives the - slot back, when the context has ended by the time it has the slot or before it - encodes. A request that waited for a shared transcode stopped at the first - request's deadline is answered 503 `server busy, try again later`, not 500, - though its own `downstream_timeout` may not have ended. govips gives pixa no - way to stop libvips once an encode has begun, so that encode keeps its slot - until it finishes; the limit of 8192 on each side of the source and of the - output bounds how long that takes. With one libvips thread, 8192x8192 random - pixels take up to about 1 second to encode as JPEG, 15 as PNG, 16 as GIF, 63 - as WebP, 110 as AVIF and 96 as JPEG XL, the last three with an alpha channel, - plus up to about 11 seconds to decode the source; `README.md` gives these - 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 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