Кеши, PR-юнит 3 (пакет D): фиксы свипера медиа-кеша + дедуп очереди фоновых загрузок #25
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?
ТЗ: свипер медиа-кеша
Часть принятой спеки
plans/cache-optimization-spec.md. Независим от других юнитов, можно делать параллельно. Один PR. Комментарии в коде — только английские.Задание 12 — фикс чистки БД (баг)
api_server.py~820–836: diff и удаление строк из SQLite выполняются толькоif files_removed > 0. Запись старше 20 дней без файла на диске выпадает из списка вremove_old_cached_files_sync(~663–687: веткаcontinueбез инкремента счётчика) — и остаётся в БД навсегда, если в том же проходе не удалился ни один реальный файл. Исправление:Задание 13 — интервал свипа в конфиг
Сейчас
delay = 60(~строка 811) — полный проход таблицы +os.walkвсего кеша каждую минуту при политиках «20 дней»/«1 час». Добавить вconfig.pyпо существующему паттерну ключcache_sweep_interval(envCACHE_SWEEP_INTERVAL, дефолт900, минимум60), использовать вcache_media_files.Задание 14 — дедуп очереди фоновых загрузок
Сейчас
download_new_filesкладёт один и тот же недокачанный файл в очередь каждым проходом свипа (особенно под FloodWait). Module-level_queued_media: set[tuple[str, int, str]]:download_new_files: ключ в set'е → skip; иначеadd+put_nowait(приQueueFull—discardиbreak, как сейчас);background_download_worker: вfinallyрядом сtask_done()—discard(key).Event loop однопоточный, обе точки — корутины без await между проверкой и мутацией → гонок нет.
Тесты
files_removed == 0→ строка удаляется из БД за один проход (регресс на задание 12).download_new_filesс одним списком → в очереди один элемент._queued_media(файл может быть переочередён позже).Критерии приёмки
addedстарше 20 дней и отсутствующим файлом исчезает из БД за один проход свипа.pytestзелёный.