From 1e8000429aa7947befaf889df55a7fff1f8bc0f0 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 15 Jun 2026 12:03:42 +0300 Subject: [PATCH] =?UTF-8?q?Todo=20=D0=BF=D1=80=D0=BE=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/todo.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/todo.md b/docs/todo.md index b5234bb..254acf6 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -35,6 +35,39 @@ Связано: [architecture.md](specs/architecture.md) → «Транспорты», пакет `ingest`/`qbt`. +### Рассинхрон состояния с реальностью (удалённый торрент / файлы) + +Состояние jellybit может разойтись с тем, что реально лежит на диске. +Несколько сценариев разной остроты: + +- **Жёсткий — удалён источник.** Раздачу удаляют (вручную или авто по + достижении seed limit), и qBittorrent стирает скачанные файлы. Тогда + хардлинк в библиотеке становится **последней** ссылкой на inode, и + обычный `undo` (`unlink` цели + чистка пустых каталогов) сотрёт + единственную копию насовсем — прямая потеря данных. Инвариант «источник + неприкосновенен» молчаливо перестаёт держаться: источника уже нет. +- **Мягкий — удалена цель.** Файлы убрали из библиотеки Jellyfin (вручную + или из самого Jellyfin), а jellybit по-прежнему числит загрузку в + `done`. Состояние врёт: ссылок уже нет, а сервис думает, что всё + разложено. + +Нужно продумать сверку записанного состояния (`file_link`, состояние +загрузки) с фактом на ФС: + +- как `worker` реагирует на исчезновение раздачи из qBittorrent + (состояние/пометка загрузки); +- как `undo` защищается, когда источник недоступен — например, + отказываться удалять, если у целевого файла счётчик ссылок == 1 (нет + второй копии) или исходный путь не существует, и явно об этом сообщать. + Откат снимает **лишний** хардлинк, а не последнюю копию файла; +- как ловить пропажу целевых файлов и отражать её в состоянии (напр. + периодическая сверка или проверка при показе — «разложено, но файлов + нет»), чтобы можно было осознанно перепривязать/переразложить. + +Связано: [ADR-2026-06-13-hardlinks](adr/ADR-2026-06-13-hardlinks.md), +[architecture.md](specs/architecture.md) → «Раскладка файлов» (undo, +инвариант источника), [workflow.md](specs/workflow.md) (`done → reverted`). + ## Средний ### Машина состояний на go-библиотеке