fix(tradein/cian): cian_history_backfill идёт через пул прокси + стоп на пустом пуле (#3197, точка 1 из 3) #3382
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3382
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3197-cian-history-backfill-proxy-pool"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Часть #3197 (шаг A2, часть 1, ПЕРВАЯ точка; раскатка по одной точке в сутки —
yandex/newbuilding.pyиadmin.pyне тронуты). Не закрывает issue.Дефект.
app/tasks/cian_history_backfill.pyконструировалBrowserFetcher(source="cian", endpoint=…)безproxy_provider/use_pool/environment→ мимо пула из 4 узлов через статическийSCRAPER_PROXY_URL, и прод-отказ #2616 («пул пуст → не ходить на env/direct») на этом пути был мёртв: признакenvironmentдо конструктора не доезжал.Фикс.
cian_history_backfill.py:217-224— по образцуdomclick_detail_backfill/house_imv_backfill:RealScraperConfig()+proxy_provider=RealProxyProvider(), use_pool=_cfg.use_proxy_pool_browser, environment=_cfg.environment. Фабрикаbuild_browser_fetcherнамеренно не взята: тесты (test_2725_heartbeat_in_batch.py:72, парити) патчатcian_history_backfill.BrowserFetcher; с фабрикой патч-поинт исчез бы и heartbeat-тест ушёл бы в сеть.:84, :240-252, :310, :401— «пул пуст» по цепочке__cause__/__context__(scraper_kit/proxy_errors.py:68 caused_by_no_proxy) →no_proxy_stop,break, блоки домов/оценок пропускаются (тот же пул).app/services/scheduler.py:164-181(_execute_cian_backfill):counters.no_proxy_stop=1+mark_failed("пул прокси пуст — к площадке не ходили (#3197)")и раннийreturnДО веткиmark_banned— отказ нашей стороны не должен уезжать вbanned(контракт #3367 для avito)._caused_by_empty_pool— схлопывание в общий хелпер отдельной правкой (их тесты ссылаются на приватные имена).Часть 2 issue (тёплый контекст переживает смену узла) для этой точки не нужна — проверено:
browser/server.py:1118-1128при смене proxy-url делает_close_browser(provider), который первой строкой_close_reusable_context(provider); плюсreuse_contextна этом пути не включён (дефолт False).Тесты:
tests/test_3197_cian_history_proxy_pool_wiring.py(kwargs фетчера через захват патча класса;NoProxyAvailableErrorна первой строке → обработана 1 из 3,no_proxy_stop), обновлён точныйassert captured == {...}в парити-тесте.Фальсификация (
git apply -Rисходников, тесты оставлены):assert None is not None(в kwargs нетproxy_provider— ровно старая пара{'source','endpoint'}),assert 3 == 1(батч прогонял все 3 строки при пустом пуле). Восстановлено — зелёное.Прогоны: полный backend
5479 passed, 35 skipped(rc=0); ruff OK.Приёмка на проде (маркер отсутствует в старом состоянии): в логе сайдкара
docker logs tradein-browser | grep 'tradein-browser\[cian\]'→прокси изменился (override=True) — relaunch перед fetchв окне первогоcian_history_backfillпосле деплоя —override=Trueпечатается только когда в теле/fetchпришёлproxy, до правки Циан его не слал. Отрицательный контроль: до деплоя строки нет. Дополнительно: прогон при пустом пуле обязан бытьstatus='failed'+counters.no_proxy_stop=1, неbanned.Code-review (06.09): ❌ критикал, проверен рабочим трактом — стоп на пустом пуле в
cian_history_backfillне срабатывает: браузерная веткаscraper_kit/providers/cian/detail.py:129-133глотает любое исключение и возвращаетNone, поэтомуcaused_by_no_proxyв бэкфилле не вызывается; настоящийbackfill_cian_historyна 5 строках с фетчером, поднимающимNoProxyAvailableError, прошёл все 5,no_proxy_stop=False, scheduler →mark_done,run_brought_data("done") → True(прогон, не ходивший к площадке, обновил свежесть). Тестtest_empty_pool_stops_the_batch_on_first_listingподменял моком самfetch_detail— зелёный по построению.Доработка в этой же ветке:
if caused_by_no_proxy(exc): raiseна общей функции (cian/detail.py:131, закрывает и ожиданиеcian_price_history.py:142), тест через настоящийfetch_detailс подделкой на уровнеBrowserFetcher.fetch()— обязан краснеть на8129e21bи зеленеть после.Проводка пула и
caused_by_no_proxyревью подтвердило: конфиг читается, а не зашит (мутацияuse_proxy_pool_browser=Trueвалит[False-dev]);ProxyPoolExhaustedErrorпод хелпер не попадает; раннийreturnчерезmark_failedпишет надмножество полейmark_done.Отдельно заведён #3384 — «пул пуст на старте батча» (
_acquire_leaseв__aenter__) уходит мимоno_proxy_stopу cian и domclick, scheduler пишетfailedсо стухшими counters; общая дыра, не регрессия ветки.