fix(tradein): неудача резолва yandex_jk_slug помечает дом — очередь не упирается в одни и те же пять (#2924) #3017

Merged
bot-backend merged 4 commits from fix/2924-yandex-jk-resolve-tried-at into main 2026-08-21 09:51:28 +00:00
Collaborator

Дефект

_SELECT_PENDING_HOUSES брал ожидающие дома ORDER BY h.id; из очереди уходил только дом, попавший в витрину. Неудачная попытка резолва не писала ничего — и следующий прогон брал те же дома в том же порядке. Замер из задачи (19.08): 397 ожидающих, первые пять по h.id занимали все пять слотов (limit: 5) каждую неделю.

Правка

  • Миграция 269houses.yandex_jk_resolve_tried_at timestamptz (nullable, без дефолта; существующие строки = «не пробовали»). Идемпотентна.
  • Выборка: не берёт дом, у которого попытка свежее RESOLVE_RETRY_DAYS = 7 (как geocode_tried_at, миграция 005); неудавшиеся — в конец очереди (ORDER BY h.id, tried_at NULLS FIRST); force=True маркер игнорирует — ручной полный проход остаётся возможным.
  • Запись: при неудаче резолва (и при падении персиста slug'а) ставится tried_at в отдельном SAVEPOINT — потеря отметки не фатальна (дом просто вернётся в очередь, как раньше), падение не роняет прогон. Удачный резолв маркер не ставит — иначе удачные дома уходили бы в конец и ждали неделю до обогащения.

Как проверено

test_2924_yandex_resolve_tried_at.py — через реальный enrich_yandex_newbuilding_sweep с двойником сессии: отдаёт pending-строки на DISTINCT ON (h.id)-выборку и запоминает весь ушедший SQL; резолвер импортируется внутри функции, поэтому патчится модуль-источник.

  • Двусторонне, против origin/main три теста красные по значению: «неудача резолва не помечена; выполненный SQL: [COUNT…, COUNT…, COUNT…, SELECT DISTINCT ON (h.id)…]» — перечень запросов, которые реально ушли; «нет фильтра по маркеру»; «маркер не обходится через force».
  • Контроль зелёный с обеих сторон: удачный резолв маркер не ставит.
  • Признак выборки — DISTINCT ON (h.id), а не FROM houses h … yandex_realty_nb: первая редакция теста ловила COUNT-запросы и краснела сама на себе — исправлено.
  • pytest tradein-mvp/backend4659 passed, 29 skipped, rc=0; гейт нумерации миграций зелёный.

Контекст, важный для чтения результата (#2860)

Первые пять домов очереди — 286394, 2671892, 2367237, 3003941, 609312 — на выкаченном коде резолвятся все (проверено в контейнере tradein-scraper тем же трактом, что обход: uspenskij, shishkinn, sadovyj-2, dueht, petrovskij). Штатный прогон придёт 24.08 02:03 UTC (interval_days: 7, последний был 17.08 — до фикса #2860). На нём маркер не понадобится; он понадобится на первом неразрешимом доме — и тогда без него пять слотов снова встали бы.

Отдельно, к решению владельца: limit: 5 при недельном интервале — ~80 недель на очередь 397. Это бюджет запросов к Яндексу, не код.

## Дефект `_SELECT_PENDING_HOUSES` брал ожидающие дома `ORDER BY h.id`; из очереди уходил только дом, попавший в витрину. **Неудачная попытка резолва не писала ничего** — и следующий прогон брал те же дома в том же порядке. Замер из задачи (19.08): 397 ожидающих, первые пять по `h.id` занимали все пять слотов (`limit: 5`) каждую неделю. ## Правка - **Миграция 269** — `houses.yandex_jk_resolve_tried_at timestamptz` (nullable, без дефолта; существующие строки = «не пробовали»). Идемпотентна. - **Выборка**: не берёт дом, у которого попытка свежее `RESOLVE_RETRY_DAYS = 7` (как `geocode_tried_at`, миграция 005); неудавшиеся — в **конец** очереди (`ORDER BY h.id, tried_at NULLS FIRST`); `force=True` маркер игнорирует — ручной полный проход остаётся возможным. - **Запись**: при неудаче резолва (и при падении персиста slug'а) ставится `tried_at` в отдельном SAVEPOINT — потеря отметки не фатальна (дом просто вернётся в очередь, как раньше), падение не роняет прогон. **Удачный резолв маркер не ставит** — иначе удачные дома уходили бы в конец и ждали неделю до обогащения. ## Как проверено `test_2924_yandex_resolve_tried_at.py` — через **реальный** `enrich_yandex_newbuilding_sweep` с двойником сессии: отдаёт pending-строки на `DISTINCT ON (h.id)`-выборку и запоминает весь ушедший SQL; резолвер импортируется внутри функции, поэтому патчится модуль-источник. - **Двусторонне, против `origin/main` три теста красные по значению:** «неудача резолва не помечена; выполненный SQL: `[COUNT…, COUNT…, COUNT…, SELECT DISTINCT ON (h.id)…]`» — перечень запросов, которые реально ушли; «нет фильтра по маркеру»; «маркер не обходится через force». - **Контроль зелёный с обеих сторон:** удачный резолв маркер не ставит. - Признак выборки — `DISTINCT ON (h.id)`, а не `FROM houses h … yandex_realty_nb`: первая редакция теста ловила `COUNT`-запросы и краснела сама на себе — исправлено. - `pytest tradein-mvp/backend` — **4659 passed**, 29 skipped, rc=0; гейт нумерации миграций зелёный. ## Контекст, важный для чтения результата (#2860) Первые пять домов очереди — `286394, 2671892, 2367237, 3003941, 609312` — на выкаченном коде **резолвятся все** (проверено в контейнере `tradein-scraper` тем же трактом, что обход: `uspenskij`, `shishkinn`, `sadovyj-2`, `dueht`, `petrovskij`). Штатный прогон придёт **24.08 02:03 UTC** (`interval_days: 7`, последний был 17.08 — до фикса #2860). На нём маркер не понадобится; он понадобится на первом неразрешимом доме — и тогда без него пять слотов снова встали бы. Отдельно, к решению владельца: `limit: 5` при недельном интервале — ~80 недель на очередь 397. Это бюджет запросов к Яндексу, не код.
bot-backend added 1 commit 2026-08-21 09:38:31 +00:00
fix(tradein): неудача резолва yandex_jk_slug помечает дом — очередь не упирается в одни и те же пять (#2924)
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Failing after 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m25s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
507c8e0611
(полное описание — в PR)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Light1YT added 1 commit 2026-08-21 09:44:03 +00:00
ci: перезапуск — CI/changes упал на checkout (git clone: some refs were not updated) в 09:38 UTC, одновременно с деплоем tradein
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Failing after 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m30s
ebb26b9382
Единственный реально упавший джоб — changes (задача 22320): лог обрывается на
'Setting up auth' checkout'а после 'Non-terminating error while running git clone:
some refs were not updated'. Три зависимых джоба помечены «Job 'changes' failed»
как пропущенные, не упавшие. Строка «'runs-on' key not defined in CI/changes»
в логах act_runner v6.3.1 стоит у десятков успешных задач за день — шум при
разборе needs, не причина. YAML головы PR байт-идентичен origin/main.
Код не меняется.
Light1YT added 1 commit 2026-08-21 09:45:34 +00:00
fix(db): миграция 269 — SET LOCAL lock_timeout перед ALTER TABLE houses (#2752)
Some checks failed
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Failing after 10s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m27s
8de9831e25
Гейт CI «блокирующий DDL без lock_timeout» покраснел по делу: ALTER TABLE
берёт ACCESS EXCLUSIVE на houses и при живом писателе ждал бы бесконечно,
копя очередь. 5с — миграция падает честно и деплой перезапускается.
Предыдущий пустой коммит «перезапуск — флуктуация раннера» был ошибкой
диагноза: я не дочитал лог changes до ::error и приписал падение
checkout'у. Единственный источник истины — строка ::error в логе самого
changes; «Job 'changes' failed» у зависимых джобов и «'runs-on' key not
defined» в act_runner v6.3.1 — шум.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Light1YT added 1 commit 2026-08-21 09:46:22 +00:00
fix(db): миграция 269 — SET LOCAL lock_timeout внутри BEGIN/COMMIT (#2752)
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m24s
bf119de7bb
Вне транзакции SET LOCAL молча ничего не делает — гейт это ловит, и он
поймал меня второй раз подряд, теперь локально, до CI.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit bb74a0e5e1 into main 2026-08-21 09:51:28 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3017
No description provided.