fix(tradein/scraper): пустой пул прокси перестаёт стирать чекпоинт полного обхода #2834

Merged
bot-backend merged 1 commit from fix/2687-full-load-infra into main 2026-08-12 12:18:03 +00:00

1 commit

Author SHA1 Message Date
bot-backend
fb6a8f34b0 fix(tradein/scraper): пустой пул прокси перестаёт стирать чекпоинт полного обхода
All checks were successful
CI Trade-In / backend-tests (pull_request) Successful in 3m56s
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
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 / openapi-codegen-check (pull_request) Has been skipped
NoProxyAvailableError — наследник RuntimeError, поэтому в run_avito_full_load /
run_cian_full_load / run_yandex_full_load он попадал в общую ветку `except
RuntimeError` → mark_failed. mark_failed, в отличие от mark_banned, НЕ пишет
done_buckets: чекпоинт всех пройденных бакетов терялся ровно на НАШЕМ отказе —
том исходе, для которого #2686 явно требовал его сохранять наравне с блокировкой
площадкой. Плюс ban_kind_of_exception отдавал для него 'unknown', хотя причина
здесь не «не установлена», а названа самим типом (proxy_errors.py: «это НАША
инфраструктура (нет живого прокси), не внешний блок»).

Достижимость на проде (замер 12.08, read-only): под avito доступны три узла
(id 9/10/11; id 1 забанен парой до 13.08). BrowserFetcher меняет lease после
_LEASE_ROTATE_AFTER_FAILS=3 подряд неудачных /fetch, а proxy_pool.acquire не
выдаёт узел с consecutive_fails >= MAX_CONSECUTIVE_FAILS=3 — девять неудачных
POST'ов опустошают пул под источник. Лестница одного полного обхода при
отказывающем сайдкаре делает до 24 POST'ов (4 бакета × 3 попытки × 2 внутренних
httpx-ретрая), то есть проходит через это состояние заведомо. Цена — прогон 3547
(09.08): 35 бакетов, 5496 объявлений за 2ч58м.

Refs #2687, #2686
2026-08-12 17:12:25 +05:00