fix(tradein/browser): гонка «execution context destroyed» — восстановимая, ретрай без relaunch (#2676) #2716
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#2716
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2676-sidecar-recoverable"
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?
Что чинит
/fetch-jsonсайдкара:goto(origin, domcontentloaded)→ фиксированный settle →page.evaluate. Страница успевает уйти в клиентскую навигацию, playwright рвёт JS-контекст →Execution context was destroyed. Эта ошибка не попадала ни в одну ветку восстановления (_is_browser_crashзнает только закрытие цели/браузера/соединения) → 500 наверх. Сайдкар общий, поэтому радиус — все детальные проходы (avito/cian/domclick).Замеры с прода (что подтвердилось, что нет)
house_imv_backfill05.08checked=50, errors=35, skipped=15, saved=0/fetch-jsonhouses.imv_error_reason, 05.08)Опровергнутая предпосылка №1 (важная). Из issue: «23 отказа по причине execution context». Проверить это уже НЕЛЬЗЯ: причина отказа до #2708 выбрасывалась клиентом (в БД лежит только «Server error '500 Internal Server Error' for url .../fetch-json»), а логи сайдкара за 05.08 стёрты пересозданием контейнера (
tradein-browserсоздан 06.08 03:43 MSK). В живом окне логов (с 00:44 UTC 06.08) строки «execution context» 0, а единственный 500 с видимой причиной —NS_ERROR_PROXY_BAD_GATEWAY(04:12, домклик), т.е. тот же код отказа даёт как минимум две разные причины. Число 23 — это счётчик 500-х, а не этой конкретной гонки.Опровергнутая предпосылка №2. «Ретрая не происходит» — на клиенте он есть:
BrowserFetcher.fetch_jsonловитhttpx.HTTPError(аHTTPStatusError ⊂ HTTPError) и делает один повтор. Наблюдение из issue «один и тот же адрес падает дважды подряд» — это и есть попытка + повтор. Значит повтор «в лоб» уже был испробован и НЕ помог → гонка воспроизводится, а не рассасывается. Поэтому здесь повтор не просто добавлен, а сделан другим: с ожиданиемload.Что сделано
_is_page_context_lost— отдельный признак, не смешанный с крашем браузера. Маркер взят из самого playwright (driver 1.60.0,coreBundle.jsв образе сайдкара — проверено grep'ом в живом контейнере), а не из строки в нашем логе; обе формы сообщения имеют общий префикс._relaunch_browser: браузер жив, умерла одна страница — relaunch стоил бы ~10-20с и тёплый профиль инстанса.load(FETCH_JSON_LOAD_WAIT_MS, best-effort, таймаут не отменяет попытку). Happy-path не удлиняется — ожидание только на ретрае.Чего тут НЕТ
Вариант 2 из issue («ждать
loadвсегда») не берётся: без замера доли этой ошибки по другим потребителям (в живом окне — 0) удлинять КАЖДЫЙ/fetch-jsonради гипотезы нельзя. Ожидание включено ровно там, где ошибка уже случилась.Test plan
test_server_fetch_json.py: обе формы сообщения playwright → повтор без relaunch,loadждётся только на повторе; таймаутloadне отменяет попытку; повтор ровно один; чужая ошибка не ретраится; причина остаётся в теле 500 (стык с #2708)ci-tradein.ymlгоняет толькоtradein-mvp/backend;tradein-mvp/browser/**тестов в пайплайне нет — отдельная дыра, не этого PR)Refs #2676