Hermes Agent 68eefff884
Build Media Mirror Worker / Build and publish (release) Successful in 1m25s
fix: heartbeat воркера — живой джоб не перехватывается как stale
Проблема: returnStaleToNew (stale-timeout 30м) смотрит только taken_at,
который ставится один раз при взятии джоба. Долгий джоб (скачивание 7.2 ГБ
11 мин + конвертация 24 мин > 30 мин) возвращался в очередь и перехватывался
вторым воркером → дубль работы, падение на скачивании, статус failed
при успешно работающем первом воркере.

Решение: heartbeat — пока джоб выполняется, воркер каждые 10 сек обновляет
taken_at (UPDATE ... WHERE status='processing'). Мёртвый воркер по-прежнему
перехватывается через stale-timeout; живой — никогда не считается зависшим.

- JobRepository.heartbeat(id): UPDATE taken_at/updated_at с guard processing
- JobProcessor: параллельная корутина heartbeat (свой CoroutineScope+Dispatchers.IO),
  отмена в finally (done/failed/cancelled)
- AppProperties.heartbeatInterval = 10s, application.yaml heartbeat-interval: 10s
- JobRepositoryTest: heartbeat обновляет processing-джоб, не трогает non-processing
2026-08-19 05:16:23 +03:00
2026-08-10 13:26:10 +00:00

media-mirror-worker

Media mirror: конвертация в зеркала для очков

S
Description
Media mirror: конвертация в зеркала для очков
Readme 165 KiB
10 Latest
2026-08-21 09:30:50 +00:00
Languages
Kotlin 99.7%
Dockerfile 0.3%