diff --git a/doc/service_lifecycle.md b/doc/service_lifecycle.md index 44e0947d..5f62de63 100644 --- a/doc/service_lifecycle.md +++ b/doc/service_lifecycle.md @@ -113,7 +113,8 @@ KEEP_ALIVE полностью отменяет FIN_WAIT. Ожидание CLOSE Worker резервирует completion до запуска и передаёт его через `uasync_post_reserved`; периодического polling нет. Destroy выполняется вне callbacks uasync, после join отменяет pending post и завершает done ровно один раз. Uasync живёт до конца этой очистки. -Результаты отменённых задач не записываются в БД. Это синхронное ожидание: длительное +Подготовленные блоки отменённых задач не регистрируются; учёт назначений подготовки +сохраняется для последующей очистки. Это синхронное ожидание: длительное транскодирование или распознавание речи может задержать stop; принудительного прерывания этих библиотек нет. @@ -125,6 +126,25 @@ completion. Отказ запуска/неверные аргументы даю закрытия temp; вызывающий отвечает за очистку своего результата при отмене. Подробные файловые контракты, 64-битные размеры и ошибки RNG описаны в `media_async.h`. +Перед файловой подготовкой назначение записывается в `media_preparations`. Успешный +`media_index_commit()` регистрирует весь файл и снимает эту запись в одном savepoint; +после ошибки/отмены путь остаётся известен, даже если worker уже опубликовал копию. +Это гарантия записи БД; файловые изменения и внешний SQL COMMIT ей не охватываются. +При обычной ошибке откатывается только регистрация; SQLite может сама отменить всю +транзакцию при тяжёлой ошибке. Общая база берётся из `ui_state.media_base` и повторно +используется после stop/start. Загрузчик не меняет существующую базу. + +Локальное удаление канала ждёт его исходящие video/register задачи. Последний +completion продолжает удаление; новые исходящие медиа канала в это время отклоняются, +подготовленные результаты ожидающих отправок не публикуются как новые сообщения. +После завершения задач отменяются загрузки/раздача и удаляются учтённые файлы, включая +назначения неуспешных подготовок. Общие файлы других каналов сохраняются. Очистка файлов +выполняется вне внешней транзакции: SQL-откат не восстанавливает удалённый файл. +При ошибке очистки записи оставшихся файлов сохраняются для повторного вызова; +удаление метаданных канала и неполная файловая очистка диагностируются отдельно. +Низкоуровневый `media_index_delete_channel()` сам workers не останавливает. +Точные ограничения путей и контракт повторной регистрации находятся в `media_index.h`. + Подготовка файлов в `src/video/video.h` выполняет remux подходящих H.264/AAC либо перекодирование в MP4 H.264/YUV420P и AAC. Worker пишет уникальный соседний временный файл, завершает декодеры/ресемплер/FIFO/кодеры, проверяет trailer, закрытие и метаданные. diff --git a/src/media_delivery/media_download.h b/src/media_delivery/media_download.h index fd81d519..26de0b8f 100644 --- a/src/media_delivery/media_download.h +++ b/src/media_delivery/media_download.h @@ -90,7 +90,7 @@ struct media_download { /* Запустить непустой файл с корректной геометрией и массивами block_ids/block_sigs. * dest_path <1024, media_base <512 байт (UTF-8); назначение принадлежит общей базе БД, смена базы отклоняется. - * Проверки идут до создания каталогов. 0 — принят: done_cb ровно один раз, в том числе синхронно при отсутствии держателей; + * Проверки идут до создания каталогов. 0 — принят: done_cb ровно один раз, в том числе синхронно при отсутствии суперузлов; * -1 — отказ без done_cb, включая уже активный media_id. Аргументы callbacks заимствованы до done_cb. * Успех включает атомарную регистрацию блоков собранного файла. Ошибка регистрации не удаляет собранный файл; * путь остаётся в media_preparations для удаления канала. Остальные поля result копируются до возврата. */