[performance] Streaming чанков снимает busy-guard акустического worker: растёт очередь устаревших jobs и снимков мира #116
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 Filed by Codex, AI-агент Владимира (chexit).
Ревью
kimi-work@cd3c4ed76d3308ec1d87341b962ff04aadada293, 1 ноября 2026. Новая регрессия исправления #110, не повтор исходной ошибки инвалидации кэша.Причина
В
Acoustics::stepпри любом измененииChanges::residencyповышаютсяseq/floorи выполняетсяself.in_flight = None(patch 0044, строка 235). Но выполняемая задача не отменяется и worker не освобождается.Дальше тот же
stepвидит отсутствиеin_flightи отправляет ещё одинJob. Канал вspawn()— неограниченныйstd::sync::mpsc::channel. Следующая смена residency повторяет это. Каждый job удерживаетArc<dyn Geometry>; в игре этоSnapshotс таблицейArc<Chunk>. Самacoustic_snapshot()пересоздаётся по content_revision, то есть при streaming это могут быть разные снимки.Поздние результаты действительно отбрасываются через floor, однако уже поставленные задачи всё равно занимают память и просчитываются последовательно, задерживая актуальную акустику. Проверка stale-result не заменяет ограничения очереди.
Подтверждено нативно
Запущены исходные
acoustics.rsи его подмодули из стека патчей 0044 в изолированном std-only harness. Макет Chunk нужен только для компиляции неиспользуемого Snapshot; тестовый Geometry сам предоставляет walker. Во время работы worker его Geometry удерживается на Condvar; inline-вызовы главного потока не блокируются. Это моделирует worker, не успевший закончить при поступлении новых чанков.32 вызова
stepс одним источником и последовательными residency дали:Проверка ограниченного количества незавершённых задач падает. Реальный FPS, объём памяти в МБ и частота такого отставания на Mac не измерялись; воспроизведено именно отсутствие backpressure, а не заявлена постоянная утечка.
Минимальное ядро воспроизведения (в tests acoustics, используя существующий
src):Исправление и приёмка
Развести «ответ этого job уже устарел» и «worker закончил job». Не очищать физическую занятость только из-за инвалидации. Альтернатива — ограниченная очередь с заменой pending job на последний снимок и/или отмена устаревшей работы.
Существующие 41 тест акустики проходят; текущий regression-test #110 проверяет отбрасывание ответа и eventual refinement, но не размер очереди при последовательных изменениях residency.
🤖 Agent: Codex — работа Владимира (chexit).
Исправлено в https://gitea.maoniao.team/chexit/horizon-airdef eae00eafc, включено в опубликованный AirDef pin 6397299.
Busy/in_flight сохраняется через residency/overflow/reset до реального завершения job. Медленный worker не получает неограниченную очередь snapshots; regression с 200 invalidations проверяет один незавершённый job.
Targeted regressions и полный client --lib проходят; после обновления v0.2.97 — 1227 passed, 42 ignored. Эти проверки не являются субъективным прослушиванием или замером пропусков аудио.
Issue оставлен открытым согласно просьбе автора.