Свип ДомКлика сохраняет лоты по корзинам, а не одним махом в конце #3592
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#3592
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/domclick-incremental-save"
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?
Снимает причину, по которой миграцией 308 (#3567) пришлось выключить домклик-свипы Москвы и области.
Замер
Прогон 7344 (
domclick_city_sweep_moskva, одиночный, прокси 13, старт 06:12:48): за два часа пройдено 2 корзины из 6 —st34.2 минуты,186+ минут. Прогон был единственным, узел не банился, QRATOR-блока в логе нет.Причина структурная: ДомКлик режет
offsetна 2000, поэтому диапазон делится бисекцией по цене и каждый лист пагинируется отдельно. У Москвы ≈23 690 лотов вторички против ≈6 300 у ЕКБ. Формула watchdog'а считает фетчи как_DOMCLICK_NUM_BUCKETS * pagesи объём выдачи не учитывает:11100 = 600 * (6 + 12) + 300. Снятие по таймауту было гарантировано.Что было сломано
_domclick_phase= «fetch_city + save». Снятие фазы (asyncio.wait_for→TimeoutError) теряло всё собранное.except TimeoutError, из_s.completed_buckets, то есть помечал пройденными корзины с нулём строк в БД — следующий прогон пропускал их черезskip_buckets, и за два-три цикла чекпоинт закрывался целиком. Гард_saved(#2406,c7a03495) закрыл это по принципу «всё или ничего».runs.is_cancelledпроверялся только перед SERP-фазой, поэтому повисший свип нельзя было снять до watchdog'а — все три часа он держал один из двух узловprovider_affinity='any'.Что сделано
save_listingsзовётся из колбэкаon_bucketсразу после каждой успешной корзины, и туда же переехал чекпоинт:done_bucketsтеперь означает «собрано И сохранено». Гард_savedснят как ненужный.Колбэк в
serp.pyстоит вне try/except конкретной корзины — иначе generic-обработчик проглотил бы исключение из него. Это же даёт отмену по корзинам: sentinel'ыRuntimeError("cancelled")/("shutdown")и разбор ветки — тот же приём, что вrun_cian_full_load._on_bucket.watchdog_sec— явный override формулы, читается изdefault_paramsв обоих хендлерах (kit-native и продуктовом, который перекрывает его ради кук Sber ID #3264).Обратная совместимость:
on_bucket=Noneиwatchdog_sec=Noneдают прежнее поведение байт-в-байт, поэтому ЕКБ-свип не затронут.Пять тестов поправлено — и это не косметика
Их стабы подменяли
fetch_cityи не звалиon_bucket. После переезда сохранения внутрь цикла такой стаб проверял мёртвую ветку:save_listingsне вызывался вовсе, поэтомуtest_domclick_unsaved_buckets_are_not_checkpointed[save_failed]получалerrors_count == 0вместо>= 1. Теперь стабы вызывают колбэк, и проверяется реальный путь.Затронуты:
test_2406_sweep_edge_cases.py,test_3369_domclick_cancel_checkpoint.py,test_scraper_kit_pipeline_parity2.py(три кейса через общий_drive_domclick).Новые тесты
tests/test_domclick_incremental_save.py— 6 штук: колбэк зовётся по разу на каждую успешную корзину и получает лоты именно этой корзины; не зовётся для упавшей корзины и послеDomClickBlockedError; исключение из колбэка прерывает обход;on_bucket=Noneсохраняет прежнее поведение;watchdog_secoverride применяется,Noneдаёт прежние 11100 приpages=100, delay=6.Прогон
Полный бэкенд-набор: 6469 passed, 70 skipped (2 мин 17 с).
ruff checkиruff formatчисто.Дальше
Возврат строк 77/50 — отдельной миграцией, после того как этот код доедет до прода. Чекпоинт прогонов 7333/7344 сбрасывать не нужно: у обоих
buckets_completedпуст, они были задрейнены деплоем до первой корзины.🤖 Generated with Claude Code
https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs