Документированы ошибки AI (advisory lock, escName) и их исправления

This commit is contained in:
2026-07-31 18:17:10 +04:00
parent d0f1edf401
commit 09d663d6d9
2 changed files with 59 additions and 2 deletions
+6 -2
View File
@@ -207,8 +207,12 @@ SVC_ID = 1 — фиксированный сервис (Болванка)
- **`_op_results`** — `threading.Lock()` вокруг всех операций чтения/записи/cleanup.
`pop(k, None)` вместо `del dict[k]` — безопасно при конкурентном доступе.
- **Advisory lock сценариев** — `pg_try_advisory_lock(hashtext('scenario:{clientId}:{stand}'))`
атомарно проверяет и захватывает блокировку. `finally: unlock_scenario()` в `run_scenario()`.
- **Partial unique index для сценариев** — `CREATE UNIQUE INDEX idx_one_running
ON scenario_runs (client_id, stand) WHERE status = 'RUNNING'`.
Делает `INSERT INTO scenario_runs ... status='RUNNING'` атомарной проверкой:
вторая параллельная вставка получает unique violation → 409.
Это заменило сломанную реализацию на `pg_try_advisory_lock` (v1.2.20),
где lock брался на одном соединении, а unlock — на другом (из пула).
- **Tracker** — `_atomic_update()`: read→mutate→write под одним `fcntl.flock`.
Исключает lost-update между `add()` и `remove()` из разных воркеров gunicorn.