fix(tradein/scraper): сигнал живости из середины батча — живые прогоны перестают числиться зависшими (#2725) #2727
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#2727
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/heartbeat-in-batch"
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?
Summary
reap_zombiesмеряетscrape_runs.heartbeat_atс порогом 6 ч, аcian_history_backfillслал heartbeat ровно один раз — до батча. Любой прогон дольше шести часов помечалсяzombieнезависимо от того, жив он или висит. Правка #2718 (clock_timestamp()) этого не чинила: она вернула честное время сигналу, которого не посылают.Замер на проде 2026-08-06 — 6 прогонов
cian_history_backfillв статусеzombie, у всех сдвиг heartbeat 16-32 мс и финал ровно наstarted_at + 6.00 ч. Живыми они при этом были: внутри окна пятерых писались строкиoffer_price_historyсsource='cian'(плановый писатель этих строк — только этот батч), у прогона 304 последняя строка легла через 5.40 ч после старта. Штатная длительность источника доходит до 5.06 ч (прогон 346). Полные таблицы — в #2725.Что сделано
backfill_cian_historyиbackfill_newbuilding_enrichmentпринимаютon_progressи дёргают его на каждой сущности;_execute_cian_backfill,run_newbuilding_enrich) переливает колбэк вupdate_heartbeatвместе с текущими счётчиками — best-effort, сбой heartbeat не роняет уже идущую работу;house_imv_backfill(#1363),geocode_missing, все*_detail_backfill.Чинится сигнал, а не критерий: пометка
zombieнесёт побочную функцию — снимает running-блокировку источника (has_running_runвидит толькоstatus='running'), и ослабление критерия заперло бы источник на зависшем прогоне навсегда. Читатели статуса проверены:has_running_run, admin-фильтрadmin.py:2323, бейдж во фронте (RunsTable.tsx,ScraperPage.tsx);_alert_if_consecutive_failureszombieне считает; resume-путей, завязанных на этот статус, в tradein нет (zombie-resume вadmin_scrape.py— другое приложение,kn_scrape_runs).newbuilding_enrichвылечен превентивно: тот же единственный стартовый вызов, на проде max 1.08 ч приlimit=25, но полный прогон — 318 домов по ~2.6 мин.listing_source_snapshot(34 зомби) в правку НЕ входит: вся работа — два set-based statement'а, heartbeat невозможен по построению; вылечено иначе в #2607, с 2026-08-02 прогоны укладываются в минуту.Test plan
tests/test_2725_heartbeat_in_batch.py— 5 тестов: сигнал на каждую сущность; 7-часовой прогон с продвигающимся heartbeat под критерий reap НЕ попадает; тот же прогон без продвижения — попадает (контроль); сбой heartbeat не прерывает батч;newbuilding_enrichпрокидывает колбэк.test_search_cache_hit(тот самый, что deselect'ится в CI).cian_history_backfillдолжен показатьheartbeat_at > started_atи ненулевые counters (сейчас источник вskipped— куки Циана протухли, поэтому ближайшая проверка — по коду в живом контейнере).Refs #2725