Свип ДомКлика ходит в тёплом браузерном контексте, а не поднимает камуфокс на каждый фетч #3595
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3595
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3118-domclick-sweep-warm-context"
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?
Что случилось
Контрольный прогон 7389
domclick_city_sweep_moskva(17.09, 14:20-17:25 UTC) подтвердил, что инкрементальное сохранение из #3592 работает — 2177 лотов легли вlistingsпо ходу прогона и пережили убийство по watchdog'у. Но заодно замер показал, почему Москва всё равно не собирается:'5+','st','1'goto(origin)timeout 60sВ логе сайдкара строка
запуск AsyncCamoufox (proxy=True, recycle_pages=15)стоит между почти каждым запросом.Причина
serp.py:525звалbuild_browser_fetcher(config, "domclick", proxy_provider=...), а у фабрики параметраreuse_contextвообще не было → дефолтBrowserFetcherFalse→ сайдкар на каждый/fetchделаетbrowser.new_page()и поднимает новый камуфокс. Якорная вкладка (#3118) в таком режиме не переживает фетч, её поднимают заново черезgoto(origin), и этиgotoвалятся по таймауту, убивая корзину целиком.Свип оказался единственным на холодном пути:
domclick_detail_backfill.py:409иavito_detail_backfill.py:430давно ходят сreuse_context=True, и там же записан замер — 26 холодных фетчей подряд = 100% блок, те же карточки в тёплом контексте = 5/5 примерно по 2 с.Почему ЕКБ это переживал: его корзины почти не требуют бисекции по цене, все шесть укладываются в ~1 час (прогоны 7116 — 4682 лота за 53 мин, 7219 — 6372 за 70 мин). Москва на холодной скорости не успевает и одну.
Что в правке
providers/_base.py—build_browser_fetcherполучил keyword-onlyreuse_context: bool = False, прокинутый в оба конструктораBrowserFetcher. ДефолтFalseсохраняет поведение остальных шести вызывающих байт в байт.providers/domclick/serp.py:525— свип зовёт фабрику сreuse_context=True.providers/domclick/serp.py, genericexcept— упавшая корзина зовётfetcher.request_context_reset()передcontinue: сгоревший тёплый контекст иначе переползает в следующую корзину, что и дало наблюдавшийся каскад из трёх.Чего в правке СОЗНАТЕЛЬНО нет
В ветке
DomClickBlockedErrorсброса нет.request_context_reset()лишь взводит_context_reset_pending(browser_fetcher.py:741), а тот уезжает в сайдкар ключомreset_contextследующегоfetch()(browser_fetcher.py:565);__aexit__его не сливает. Послеbreakфетчей больше не будет — вызов был бы no-op'ом, который читается как защита.Остаётся известная дыра:
_contexts[provider]в сайдкаре (browser/server.py:826) — обычный dict без TTL, чистится только явнымreset_contextили вытеснением провайдера. Значит сожжённый QRATOR-блоком контекст достаётся следующему прогону. Закрыть можно только отдельной ручкой сброса в сайдкаре (сейчас там/fetch,/fetch-json,/login,/health,/pacing) — отдельной задачей.Проверенные риски
domclick. Драки за якорную вкладку не будет: backfill строит origin как{scheme}://{netloc}/pokupka/kvartiry/vtorichka(detail.py:642), для Москвы он совпадает со свиповым.domclick_detail_backfill». Поscrape_runsbackfill (run 7399) стартовал 17:18:50, а корзины падали в 16:04-16:08 — пересечения нет.Тесты
Новый
test_3118_domclick_reuse_context.py— 4 теста: дефолт и явный флаг у фабрики, свип строит фетчер именно сreuse_context=True, упавшая корзина сбрасывает контекст на каждой из шести.Три существующих двойника фетчера дополнены (
test_domclick_incremental_save.py,test_kit_serp_proxy_pool.py,test_2670_streak_and_partial_coverage.py) — без этого они падалиTypeError/AttributeError, то есть проверяли собственную неполноту вместо поведения свипа.Локально: 6473 passed, 74 skipped. Ruff чист.
Как проверять после деплоя
Ручной прогон Москвы и сравнение страниц в час против сегодняшних 600 за 3 ч 05 мин.