fix(tradein/scrapers): cian_city_sweep честный статус при defensive abort (#1949) #2339

Merged
lekss361 merged 1 commit from fix/1949-cian-full-load-zombie-watchdog into main 2026-07-03 22:45:48 +00:00
Owner

Closes #1949

Диагностика 2026-06-27 нашла 3 root cause в #1949:

  1. cian_full_load зомбится ~43% — уже закрыто ранее, PR #1952 (per-fetch wait_for + фоновый heartbeat).
  2. cian_city_sweep фиксированный ANCHOR_TIMEOUT_SEC=240уже закрыто ранее, PR #2272 (масштабирование через _cian_anchor_timeout_s(), часть scraper-kit pool activation, #2160).
  3. mark_banned красит весь run даже если SERP уже сохранил лоты — этот паттерн был исправлен для avito (avito_serp_ok_not_banned, #1950/PR #1952), но НЕ применён к run_cian_city_sweep. Это единственный реальный gap, закрытый этим PR.

Новый helper _mark_cian_sweep_abort(db, run_id, counters, reason) перед run_cian_city_sweep: на defensive abort (TimeoutError / consecutive SERP failures) проверяет lots_inserted + lots_updated > 0 — если да и cian_sweep_ok_not_banned=True (новый флаг, default True) → mark_done с abort_note; иначе mark_banned как раньше (backward-compat при flag=False). Отдельный от avito флаг — не смешиваем cian/avito семантику.

3 новых regression-теста (lots>0→mark_done, lots=0→mark_banned, flag=False→backward-compat). Не трогает _rotate_proxy_ip/changeip (#1950, отдельным PR) и non-cian источники.

Известный follow-up (не в этом PR): та же mark_banned-без-lots-check логика существует в scraper-kit-копии run_cian_city_sweep (tradein-mvp/packages/scraper-kit/.../pipeline.py) — отдельная активная архитектура, вне scope этой задачи (задокументировано в vault, кандидат на #2277 cleanup-волну).

Проверено: ruff чисто, 13/13 новых+существующих тестов зелёные, широкий scoped run (cian/scraper_resilience/anchor_watchdog/sweep_drain/provider_rotation) — 334 passed. code-reviewer APPROVE.

Closes #1949 Диагностика 2026-06-27 нашла 3 root cause в #1949: 1. `cian_full_load` зомбится ~43% — **уже закрыто** ранее, PR #1952 (per-fetch `wait_for` + фоновый heartbeat). 2. `cian_city_sweep` фиксированный `ANCHOR_TIMEOUT_SEC=240` — **уже закрыто** ранее, PR #2272 (масштабирование через `_cian_anchor_timeout_s()`, часть scraper-kit pool activation, #2160). 3. `mark_banned` красит весь run даже если SERP уже сохранил лоты — этот паттерн был исправлен для avito (`avito_serp_ok_not_banned`, #1950/PR #1952), но НЕ применён к `run_cian_city_sweep`. **Это единственный реальный gap, закрытый этим PR.** Новый helper `_mark_cian_sweep_abort(db, run_id, counters, reason)` перед `run_cian_city_sweep`: на defensive abort (TimeoutError / consecutive SERP failures) проверяет `lots_inserted + lots_updated > 0` — если да и `cian_sweep_ok_not_banned=True` (новый флаг, default True) → `mark_done` с `abort_note`; иначе `mark_banned` как раньше (backward-compat при flag=False). Отдельный от avito флаг — не смешиваем cian/avito семантику. 3 новых regression-теста (lots>0→mark_done, lots=0→mark_banned, flag=False→backward-compat). Не трогает `_rotate_proxy_ip`/changeip (#1950, отдельным PR) и non-cian источники. **Известный follow-up (не в этом PR):** та же mark_banned-без-lots-check логика существует в scraper-kit-копии `run_cian_city_sweep` (`tradein-mvp/packages/scraper-kit/.../pipeline.py`) — отдельная активная архитектура, вне scope этой задачи (задокументировано в vault, кандидат на #2277 cleanup-волну). Проверено: ruff чисто, 13/13 новых+существующих тестов зелёные, широкий scoped run (`cian`/`scraper_resilience`/`anchor_watchdog`/`sweep_drain`/`provider_rotation`) — 334 passed. code-reviewer APPROVE.
lekss361 added 1 commit 2026-07-03 22:43:35 +00:00
fix(tradein/scrapers): cian_city_sweep честный статус при defensive abort (#1949)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 7s
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 / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m41s
0f6bda31e7
Два из трёх root cause в #1949 (cian_full_load per-fetch zombie + city_sweep
anchor-timeout scaling) уже были закрыты ранее (#1952, #2272). Оставшийся
gap: mark_banned красил весь run даже когда SERP-фаза уже сохранила лоты —
статус должен быть done, не banned, когда основной сбор состоялся. Зеркалит
уже существующий avito_serp_ok_not_banned (#1950) под отдельным флагом
cian_sweep_ok_not_banned (не смешиваем cian/avito семантику).
lekss361 merged commit e3d26f0aae into main 2026-07-03 22:45:48 +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#2339
No description provided.