Skip to content

Восстанавливать повреждённые thumbnails без ручной очистки #68

Open

Description

@syrok0010

Сводная задача

#65

Что сделать

Писать во временный файл в том же каталоге и атомарно публиковать готовый результат. На decode failure локального thumbnail удалять повреждённую запись и допускать один контролируемый refetch.

Контекст и результат для пользователя

Процесс завершается или заканчивается место во время File.writeBytes в конечный путь thumbnail. На диске остаётся пустой или частично записанный файл; до успешного upsert в Room выполнение могло не дойти.

resolveThumbnailFile сначала проверяет только isFile и сразу возвращает путь, не вызывая ensureAvailable. Decode ломается, но файл не удаляется и не перезагружается. Следующие запросы снова выбирают тот же повреждённый файл до внешней очистки.

Критерии приёмки

  • Неоконченная запись не публикуется в конечный thumbnail path; выбран механизм атомарной публикации в том же каталоге.
  • Decode failure существующего повреждённого thumbnail инвалидирует файл и согласует DAO state, после чего допускается ограниченный refetch.
  • Повторно невалидный server response приводит к состоянию ошибки, а не бесконечному циклу.
  • Тесты покрывают write failure после части bytes, пустой файл, повторный decode failure и отсутствие успешной DAO записи.
  • После восстановления сети/валидного ответа изображение загружается без logout или ручного удаления cache.

Ограничения и компромиссы

Atomic rename защищает от частичной записи, но не от корректно записанного невалидного ответа сервера. Нужны ограниченный retry и согласование файлов с DAO; полноценная гарантия offline durability здесь не требуется.

Проверка

Инъекция write failure после части bytes и повторный fetch: восстановление без ручного logout. Дополнительно пустой файл, ошибка decode и отсутствие бесконечного повторения.

Зависимости

Блокирующих задач нет; можно выполнять самостоятельно. Связанные исправления общего cache следует координировать при параллельной реализации.

Основание

Аудит 08.09.2026, пункт I2, commit c49d4b1. Приоритет аудита P2; высокая по пути повреждения · аварийное завершение процесса не моделировалось. Это не обещание измеренного ускорения.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingready-for-agentReady for an AI agent to implement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions