44 lines
3.0 KiB
Markdown
44 lines
3.0 KiB
Markdown
---
|
||
work_item: ORCH-113
|
||
stage: architecture
|
||
author_agent: architect
|
||
status: proposed
|
||
created_at: 2026-06-15
|
||
model_used: claude-opus-4-8
|
||
---
|
||
|
||
# 08 — Требования к данным: ORCH-113 — reaper finalizer-liveness ownership
|
||
|
||
Work Item: **ORCH-113** · Repo: **orchestrator** · Стадия: architecture
|
||
|
||
> When-applicable / информационный (гейтом не парсится).
|
||
|
||
## Изменения схемы БД
|
||
|
||
**N/A — нулевое изменение схемы.** Сознательное архитектурное решение (ADR-001 / adr-0043): сигнал
|
||
владения финализацией — **in-memory** (leaf `src/finalizer_liveness.py`), а не durable-колонка. Ни
|
||
новых таблиц, ни новых колонок, ни индексов; `init_db()` / `_ensure_column` не трогаются. Схема
|
||
существующих таблиц (`jobs`, `agent_runs`, `tasks`, …) и их семантика — **байт-в-байт** (NFR-2/AC-5).
|
||
|
||
## Новые/изменённые сущности
|
||
|
||
**Процесс-локальный реестр владения** (не БД): `finalizer_liveness` хранит
|
||
`{job_id: {"run_id", "stage", "started_ts"}}` под `threading.Lock`. Запись/снятие — живой
|
||
монитор-поток (`launcher._monitor_agent`); чтение — reaper-поток (`job_reaper`). Ключ — `jobs.id`
|
||
(существующая сущность). Никаких новых персистентных данных.
|
||
|
||
## Совместимость данных / миграции
|
||
|
||
- **Миграций нет** — нечего мигрировать (нет схемных изменений); общая прод-БД (self-hosting +
|
||
enduro-trails) не затрагивается.
|
||
- **Restart-safe без durable (NFR-5):** in-memory реестр сбрасывается при рестарте процесса, что
|
||
**безопасно** по существующему контракту: `main.lifespan` вызывает `requeue_running_jobs()`
|
||
(`running → queued`, `main.py:59`) **до** старта reaper (`main.py:144`). После рестарта нет ни одного
|
||
`running`-job, ссылающегося на потерянный маркер → отсутствие маркера корректно (нет живых
|
||
finalizer'ов). Гибель **потока** монитора (не процесса) покрыта `try/finally`-снятием маркера; гибель
|
||
**процесса** → рестарт → requeue.
|
||
- **Авторитетность in-memory** опирается на одно-процессную модель (один uvicorn-воркер, общая
|
||
SQLite-БД; проверено: CMD без `--workers`). Условие задокументировано как инвариант сопровождения —
|
||
при вводе `--workers>1` сигнал должен стать durable (см. `10-tech-risks.md` TR-3).
|
||
</content>
|