Документированы ошибки AI (advisory lock, escName) и их исправления
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user