[2026-09-14 21:42:11] taiga-vault: family/documents/vault-sync/2026-09-14-cron-api-timeout-sync-outage.md
This commit is contained in:
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
tags: [vault-sync, incident, cron, deepseek, api-timeout, taiga]
|
||||||
|
created: 2026-09-14
|
||||||
|
updated: 2026-09-14
|
||||||
|
status: resolved 2026-09-14 21:40 UTC — sync прогнан вручную, все три фазы Pushed ✓, данные целы; причина (LLM timeout в cron-задаче) не устранена на уровне конфига
|
||||||
|
---
|
||||||
|
|
||||||
|
# Incident 2026-09-14: 3-часовой разрыв в vault-sync — cron-задача блокировалась API-таймаутами deepseek
|
||||||
|
|
||||||
|
**Контекст:** cron-задача Hermes `sync-vault` (id `29851c413903`, `*/5 * * * *`, prompt = `bash /opt/data/sync-vault.sh >> /tmp/vault-sync.log 2>&1`) за 2026-09-14 не отработала **три часа подряд**.
|
||||||
|
|
||||||
|
## Симптом
|
||||||
|
|
||||||
|
В `/tmp/vault-sync.log` разрыв между тиками:
|
||||||
|
|
||||||
|
```
|
||||||
|
[2026-09-14 18:30:16] [syncthing-out] Pushed ✓
|
||||||
|
[2026-09-14 21:30:52] [syncthing] Pushed ✓
|
||||||
|
```
|
||||||
|
|
||||||
|
GAP 18:30:16 → 21:30:52 = **180.6 мин**. Остальные разрывы за сутки — штатные 9–10 мин (пропущенные тики диспетчера).
|
||||||
|
|
||||||
|
## Корень: не диспетчер, а LLM-вызовы внутри задачи
|
||||||
|
|
||||||
|
В `/opt/data/cron/executions.db` по job_id `29851c413903` за сутки: **258 запусков, 252 completed, 6 failed**. Пять из шести падений приходятся на окно разрыва:
|
||||||
|
|
||||||
|
| claimed_at (UTC) | finished_at (UTC) | длит. | ошибка |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 18:35:09 | 19:05:21 | 30.2 мин | `RuntimeError: Non-streaming API call timed out after 600s with no response` |
|
||||||
|
| 19:10:15 | 19:40:29 | 30.2 мин | то же |
|
||||||
|
| 19:45:23 | 20:42:25 | 57.0 мин | то же |
|
||||||
|
| 20:45:37 | 21:15:50 | 30.2 мин | то же |
|
||||||
|
| 09:55:39 | 09:55:42 | 3 с | `RuntimeError: HTTP 402: Insufficient Balance` (deepseek) |
|
||||||
|
|
||||||
|
**Механика:** prompt задачи — bash-команда, но её исполняет агент, т.е. каждый тик = LLM-раунд. Когда провайдер (deepseek-v4-flash) не отвечает, вызов висит до порога 600 с, повторные попытки растягивают один запуск до 30–57 мин, и **последующие 5-минутные тики не запускаются** — `next_run_at`/claim занят. Sync в это время стоит (в логе — ничего). Это не проблема `sync-vault.sh` и не «пропущенный тик» из [[vault-sync-infrastructure]], а блокировка очереди зависшим LLM-вызовом.
|
||||||
|
|
||||||
|
Дополнительно: в 09:55 UTC deepseek отдал **HTTP 402 Insufficient Balance** — стоит проверить баланс провайдера.
|
||||||
|
|
||||||
|
## Проверка целостности (после ручного прогона 21:40:52)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash /opt/data/sync-vault.sh >> /tmp/vault-sync.log 2>&1 # exit 0
|
||||||
|
```
|
||||||
|
|
||||||
|
- Лог: `Pushed ✓` по всем трём фазам (syncthing, taiga-vault, syncthing-out), `Already up to date.`
|
||||||
|
- Все три репозитория на одном коммите: `/vault` = `/obsidian-syncthing` = bare = `512353df` (`[2026-09-14] eagle: family/plans/t610-home-automation.md`), рабочие деревья чистые (`git status --porcelain` пусто).
|
||||||
|
- Коммиты Eagle (вплоть до 23:32 +0600) доехали до всех клонов. **Потерь нет** — git-синк идемпотентен, следующий удачный тик догоняет всё.
|
||||||
|
|
||||||
|
## Что можно сделать (не сделано, требует решения Алексея)
|
||||||
|
|
||||||
|
1. **Убрать LLM из петли:** `hermes cron edit 29851c413903 --no-agent --script <script>` — тогда скрипт запускается напрямую и зависание провайдера его не блокирует. Ограничение: `--script` требует файл под `~/.hermes/scripts/`, а в контейнере `/root/.hermes` **не существует** и `/root` не переживает рекреацию контейнера — нужен персистентный путь/симлинк на `/opt/data/`.
|
||||||
|
2. **Пин модели/провайдера** для этой задачи (`--model` / `--provider`) на более стабильный бэкенд.
|
||||||
|
3. **Оставить как есть:** цена — разрывы до нескольких часов при деградации провайдера, данные не теряются.
|
||||||
|
|
||||||
|
## Уроки
|
||||||
|
|
||||||
|
1. Разрыв в `/tmp/vault-sync.log` >30 мин — смотреть **не только** лог sync, но и `executions.db`: тик может быть занят зависшим запуском, а не «пропущен» диспетчером.
|
||||||
|
2. Диагностический запрос:
|
||||||
|
```bash
|
||||||
|
python3 -c "
|
||||||
|
import sqlite3; c=sqlite3.connect('file:/opt/data/cron/executions.db?mode=ro',uri=True)
|
||||||
|
for r in c.execute(\"select claimed_at,finished_at,status,error from executions where job_id='29851c413903' order by claimed_at desc limit 20\"): print(r)"
|
||||||
|
```
|
||||||
|
3. Скриптовая cron-задача, оформленная как prompt, наследует все риски LLM-провайдера (таймауты, 402) — для чистой механики (sync, healthcheck) лучше `--no-agent`.
|
||||||
|
|
||||||
|
## Связанные заметки
|
||||||
|
- [[2026-09-02-dubious-ownership-and-merge-cleanup]] — предыдущий инцидент sync (dubious ownership /vault.git)
|
||||||
|
- [[2026-08-31-syncthing-truenas-incident]]
|
||||||
Reference in New Issue
Block a user