fix(tradein/domclick): таймаут сайдкара и пустой пул считались отказами площадки (#3283) #3286
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#3286
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3283-non-blocks-counted-as-blocks"
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?
Закрывает #3283. Найдено при попытке загрузить очередь Домклика (2 001 объявление без карточки) — она не грузится именно из-за этого.
Доказательство
Прогон 5399 (30.08, батч 400) умер по правилу «3 блока подряд», не обогатив ни одной карточки. Из трёх засчитанных блоков отказом Домклика не был ни один:
Третий случай особенно нагляден: запрос к площадке не отправлялся вовсе.
NoProxyAvailableErrorдокументирован дословно как «НАША инфраструктура, не внешний блок» и поднимается до HTTP-запроса — считать его отказом Домклика прямо противоречит его же контракту.Лог абортa сам печатал
диагнозы: {'unknown': 3}, то есть информация была, но в решении не участвовала.Почему нельзя было чинить по статусу
Первая попытка — «считать блоками только
kind == platform» — уронила четыре существующих теста, и правильно сделала: настоящий QRATOR-челлендж приходит без HTTP-статуса, то есть по статусу неотличим от таймаута навигации. Классификация по коду ответа здесь не работает в принципе.Различима природа исключения, причём разделение уже проведено в
fetch_detail:except SidecarBanPageErrorreport_banparse_detail_html→DomClickBlockedErrorexcept Exception→raise ... from exc__cause__Отсюда и признак: httpx-ошибка в цепочке причин. Он не опирается ни на статус, ни на текст сообщения.
Правка
failedс внятной причиной, а не вbanned— запись не должна утверждать про площадку то, чего не было.failed, туда же, куда давно идётDomClickParseError(он честно помечен «schema drift, not a block»), и счётчик блоков не трогают.max_consecutive_soft_failures=10. Если площадка отказывает молча и сайдкар не отдал статус, прогон обязан остановиться — просто позже. Без этого снятие хайртриггера оставило бы прогон вовсе без тормоза.Порог для сбоев выше блочного намеренно: цена ошибки несимметрична. Ложный обрыв стоит целого прогона и часов простоя узла, лишний запрос к живой площадке — одного запроса. Та же логика, что в #3272.
Тесты
10 проверок, включая дословный сценарий 5399 и страховку «генуинные блоки по-прежнему рвут прогон после трёх». Проверено мутациями:
Отдельно показательно: четыре существовавших теста на генуинный блок проходят без единой правки. Это и есть признак того, что разделение проведено по верному основанию — старое поведение для настоящих отказов сохранено побайтово.
Набор целиком —
5206 passed, 37 skipped.Мелочь
В теле коммита одна строка потеряла фрагмент: обратные кавычки в
-mбыли съедены оболочкой. Смысл строки — тот, что в таблице выше; правку истории не делал.Прогон 5399 умер по правилу «3 блока подряд», не обогатив ни одной карточки из 400. Отказом Домклика не был ни один из трёх: два — HTTP 500 от сайдкара (таймаут навигации), третий — пустой пул, при котором запрос к площадке не отправлялся вовсе. Лог абортa сам это печатал: диагнозы {'unknown': 3}. Различать по HTTP-статусу нельзя: настоящий QRATOR-челлендж приходит без статуса и неотличим от таймаута — на этом и стояли прежние тесты. Различима природа исключения, причём разделение уже проведено в fetch_detail: генуинный бан приезжает через SidecarBanPageError или маркеры в parse_detail_html, а транспорт — через с , то есть с httpx-ошибкой в цепочке причин. Три правки: * пустой пул (NoProxyAvailableError в цепочке) — не блок, а остановка прогона: продолжать бессмысленно, каждая следующая карточка упрётся в то же. Прогон уходит в failed, а не banned — запись не должна утверждать про площадку то, чего не было; * транспортные сбои идут в failed, туда же, куда давно идёт DomClickParseError («schema drift, not a block»), и счётчик блоков не трогают; * отдельный сторож на молчаливый отказ: max_consecutive_soft_failures=10, иначе снятие хайртриггера оставило бы прогон без тормоза вовсе. Тесты: 10 проверок, включая дословный сценарий 5399 и страховку «генуинные блоки по-прежнему рвут прогон после трёх». Проверено мутациями: возврат пустого пула в блоки роняет 2, возврат транспорта — 6, снятие сторожа — 2. Четыре существовавших теста на генуинный блок продолжают проходить без правки — это и показывает, что разделение проведено по верному признаку. Набор целиком — 5206 passed, 37 skipped.