fix(tradein/yandex): инкрементальный per-combo save + bounded gate-timeout (анти-зомби city_sweep) #1845

Merged
lekss361 merged 1 commit from fix/tradein-yandex-sweep-robustness into main 2026-06-20 18:01:56 +00:00
Owner

Проблема (live 2026-06-20)

yandex_city_sweep фрагилен (зомбит, теряет всё при краше):

  1. Пакетный save в конце anchor'а — за 20 мин активного фетча (gate отдавал «20 cards»/страницу) 0 строк в БД (counters=None); при краше до конца anchor'а — потеря всего собранного.
  2. Долгие gate-таймауты — page.goto 120с × (1+2 retry) = до 360с на один stuck-combo → sweep копит таймауты (29 за 30 мин), не укладывается, зомбит.

Контеншн (browser sharing с avito) уже снят прежними фиксами — это собственные изъяны yandex-пути.

Фикс

A — инкрементальный per-combo save (scrape_pipeline.py _yandex_anchor_phases, yandex_realty.fetch_around_multi_room): добавлен on_combo(label, new_lots) callback → save_listings(db, new_lots) + update_heartbeat после каждого (segment×rooms×price) combo (зеркало avito on_bucket). Данные персистятся сразу, прогресс виден, краш не теряет собранное.

B — bounded gate-timeout (browser_fetcher.py + yandex_realty.py): BrowserFetcher(fetch_timeout_s=...) параметр (default 120 backward-compat); yandex открывает с 30с (_YANDEX_BROWSER_FETCH_TIMEOUT_S). Worst-case stuck-combo: 30×3=90с вместо 360с. Combo с исчерпанными ретраями → skip + WARNING (счётчик combos_skipped), не зацикливается.

Тесты

  • Обновлены 6 + добавлено 4 теста (incremental save per-combo вызывается, skip не вызывает save/on_combo).
  • Полный pytest: 2225 passed, 2 pre-existing fails (cian cache, search auth — на main).
  • avito/cian не затронуты. ruff green.

Эффект

yandex_city_sweep перестаёт быть all-or-nothing (партии в БД сразу) + не жжёт минуты на флаки-combo → не зомбит, наполняет yandex как источник кросс-валидации. Связано: аудит скрапперов 2026-06-20.

## Проблема (live 2026-06-20) `yandex_city_sweep` фрагилен (зомбит, теряет всё при краше): 1. **Пакетный save в конце anchor'а** — за 20 мин активного фетча (gate отдавал «20 cards»/страницу) **0 строк в БД** (counters=None); при краше до конца anchor'а — потеря всего собранного. 2. **Долгие gate-таймауты** — page.goto 120с × (1+2 retry) = до 360с на один stuck-combo → sweep копит таймауты (29 за 30 мин), не укладывается, зомбит. Контеншн (browser sharing с avito) уже снят прежними фиксами — это собственные изъяны yandex-пути. ## Фикс **A — инкрементальный per-combo save** (`scrape_pipeline.py` `_yandex_anchor_phases`, `yandex_realty.fetch_around_multi_room`): добавлен `on_combo(label, new_lots)` callback → `save_listings(db, new_lots)` + `update_heartbeat` **после каждого (segment×rooms×price) combo** (зеркало avito on_bucket). Данные персистятся сразу, прогресс виден, краш не теряет собранное. **B — bounded gate-timeout** (`browser_fetcher.py` + `yandex_realty.py`): `BrowserFetcher(fetch_timeout_s=...)` параметр (default 120 backward-compat); yandex открывает с **30с** (`_YANDEX_BROWSER_FETCH_TIMEOUT_S`). Worst-case stuck-combo: 30×3=90с вместо 360с. Combo с исчерпанными ретраями → **skip + WARNING** (счётчик `combos_skipped`), не зацикливается. ## Тесты - Обновлены 6 + добавлено 4 теста (incremental save per-combo вызывается, skip не вызывает save/on_combo). - Полный pytest: **2225 passed, 2 pre-existing fails** (cian cache, search auth — на main). - avito/cian не затронуты. ruff green. ## Эффект yandex_city_sweep перестаёт быть all-or-nothing (партии в БД сразу) + не жжёт минуты на флаки-combo → не зомбит, наполняет yandex как источник кросс-валидации. Связано: аудит скрапперов 2026-06-20.
lekss361 added 1 commit 2026-06-20 17:58:57 +00:00
fix(tradein/yandex): инкрементальный per-combo save + bounded gate-timeout (анти-зомби city_sweep)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
37f12f6303
lekss361 merged commit 482ddc794e into main 2026-06-20 18:01:56 +00:00
lekss361 deleted branch fix/tradein-yandex-sweep-robustness 2026-06-20 18:01:56 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1845
No description provided.