Кеши, PR-юнит 4 (пакет E): хелпер путей медиа-кеша + in-memory MIME-кеш на горячем пути /media #26
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?
ТЗ: горячий путь /media
Часть принятой спеки
plans/cache-optimization-spec.md. Независим от других юнитов, можно делать параллельно. Один PR. Комментарии в коде — только английские.Задание 15 — константа и хелпер путей
os.path.abspath("./data/cache")+ ручнойjoinсобираются в семи местах (api_server.py~207, 532–536, 667, 757–766, 817, 851, 1172–1175) — формат пути является неявным контрактом между ними. Ввести на уровне модуля:Заменить все семь мест.
remove_old_cached_files_sync/download_new_filesсохраняют параметрcache_dir(тестируемость), вызыватели передают константу.Задание 16 — in-memory кеш MIME
Запись access-time уже вынесена с горячего пути в аккумулятор (
_access_updates), а чтение MIME до сих пор делает threadpool-hop + НОВОЕ SQLite-соединение на каждый хит (prepare_file_response, ~389–404). MIME по ключуfile_unique_idиммутабелен.Порядок в
prepare_file_response: dict → (miss) SQLite → (miss) python-magic → записать и в SQLite, и в dict. При успешном чтении из SQLite — заполнить dict. При переполнении —clear().Тесты
media_cache_pathстроит ровно текущий layout (регресс формата пути).get_mime_type_sync: два запроса подряд к одному файлу — второй его НЕ вызывает._mime_types(>_MIME_CACHE_MAX) →clear()без исключений, следующий запрос снова заполняет.Критерии приёмки
/media-хит не создаёт SQLite-соединений (ни на чтение MIME, ни на запись access-time). Рецепт проверки: monkeypatchfile_io._open_dbсчётчиком соединений; два последовательных запроса TestClient к одному файлу — на втором счётчик не растёт.pytestзелёный.