Два связанных фикса из диагностики 2026-06-27: ФИКС C (run_cian_full_load, per-fetch timeout): monkey-patch _browser.fetch → asyncio.wait_for(_f(url), timeout=cian_full_load_per_fetch_timeout_s=90s). BrowserFetcher.fetch имеет httpx-timeout 120s, но browser-сервис иногда виснет так что httpx не получает ответ (нет EOF) → fetch висит → asyncio.gather блокирует весь bucket → heartbeat_at не обновляется → reap_zombies убивает живой run. wait_for(90s) отменяет зависший fetch → TimeoutError → _fetch_page_html ловит как Exception → None → _one_page → [] → gather завершается нормально. За флагом (cian_full_load_per_fetch_timeout_s=0 = отключить, >0 = включить). ФИКС D (background heartbeat): asyncio.create_task(_background_heartbeat()) обновляет heartbeat_at каждые 60s независимо от on_bucket/on_progress прогресса. Без него пустые bucket или зависший gather замораживает heartbeat на несколько часов. Task отменяется в finally → не течёт при return/raise/cancel. Новая настройка (ENV): CIAN_FULL_LOAD_PER_FETCH_TIMEOUT_S=90.0 — timeout одного browser-fetch |
||
|---|---|---|
| .. | ||
| api | ||
| core | ||
| observability | ||
| schemas | ||
| services | ||
| tasks | ||
| __init__.py | ||
| main.py | ||
| scheduler_main.py | ||