gendesign/tradein-mvp/backend
bot-backend 9f950a5f17 fix(scheduler): atomic _claim_run via advisory xact lock (Refs #750)
Конкурентные scheduler-тики одного source (redeploy-overlap старого+нового
контейнера / 2 реплики) оба проходили has_running_run pre-check и запускали
ДВОЙНОЙ city-sweep → 2x rate к Avito/Cian → бан скрапера.

Path A: transaction-scoped pg_try_advisory_xact_lock(hashtext(source)) после
pre-check сериализует claim; non-blocking (lock занят → return None). Под локом
double-checked has_running_run (running мог появиться в окне pre-check→lock).
Лок авто-снимается на commit/rollback.

Path B (partial unique index WHERE status='running') отклонён: миграция могла
упасть на deploy если dirty-данные уже содержат >=2 running-строк на source
(ровно то, что баг и создаёт) — рискованно перед demo.

Tests: double-call→один run; lock unavailable→skip; running-under-lock→rollback+skip.
2026-05-30 19:01:37 +03:00
..
app fix(scheduler): atomic _claim_run via advisory xact lock (Refs #750) 2026-05-30 19:01:37 +03:00
data/sql feat(scrapers): wire N1.ru city sweep — pipeline + scheduler + admin endpoint (#575) (#745) 2026-05-30 15:43:38 +00:00
scripts feat(backtest): per-rooms asking→sold correction block (#648 S1) (#650) 2026-05-29 13:11:55 +00:00
tests fix(scheduler): atomic _claim_run via advisory xact lock (Refs #750) 2026-05-30 19:01:37 +03:00
.dockerignore feat: add tradein-mvp subproject (Trade-In Estimator под /trade-in) 2026-05-21 00:25:39 +03:00
Dockerfile feat(tradein): persistent infra для backfill scripts (PR F) (#592) 2026-05-27 06:59:54 +00:00
pyproject.toml feat(rbac): role-based access control via X-Authenticated-User middleware (#585) 2026-05-26 06:18:40 +00:00