refactor(tradein/scheduler): удалить legacy scheduler_loop, kit единственный путь (#2397 Part C) #2402
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#2402
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "refactor/tradein-remove-legacy-scheduler-loop"
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
Umbrella #2397 Part C (эпик #2277 decommission legacy orchestration). Удаляет legacy in-app scraper-scheduler (
scheduler_loop+ 27trigger_*_run+ dispatch-машинерия) изapp/services/scheduler.py(2098→418 строк), делаяscrape_pipeline.pyудаляемым в Part E.Топология подтверждена перед удалением (
docker-compose.prod.yml):tradein-backendSCHEDULER_ENABLE=false(main.py in-app launch был мёртв),tradein-scraperSCHEDULER_ENABLE=true+USE_KIT_SCHEDULER=true(уже 100% kit)._run_kit_schedulerсамодостаточен, не импортит legacy. Все 29 job-sources имеют kit-handler (deep-review вручную сверил).scheduler.py: удаленоscheduler_loop,get_due_schedules,reap_zombies,_claim_run,_defer_next_run_at,_spawn_tracked/_drain_inflight, 27trigger_*_run, импорт scrape_pipeline. Оставлено:compute_next_run_at,has_running_run(admin.py),import_rosreestr_dkp,_execute_cian_backfill(product_handlers.py).main.py: убран launch legacyscheduler_loop(dead-code, backend SCHEDULER_ENABLE=false).scheduler_main.py: убрана ship-dark развилкаUSE_KIT_SCHEDULER=false→ legacy fallback — kit теперь безусловный путь. SIGTERM/drain-семантика сохранена. (Поле флага оставлено,extra="ignore"защищает от leftover env.)trigger_X_run→product_handlers._job_X(docstring-only).scrape_pipeline.py: 0 рантайм-импортёров после этого PR (orphaned, готов к Part E). Файл не тронут.build_product_handlers, ловит будущий уронённый handler — доказано break/restore), починен устаревший_PRODUCT_SOURCES(+cian_history_backfill/deals_freshness_monitor/osm_poi_ekb_refresh).⚠️ Behavior change
Убирает fallback
USE_KIT_SCHEDULER=false— kit единственный scheduler-путь. Интенционально (директива «сноси»). Прод уже на kit; откат =git revert(не флаг). Dev-compose: backend больше не запускает scheduler в dev (был legacy, dev-only, не прод).Review
deep-code-reviewer— ✅ APPROVE. 3 критичных проверки прошли: нет пропущенного живого вызывающего, SIGTERM-drain сохранён, все job-sources имеют kit-handler. Единственный 🟠 (потерянный registry-гвард) закрыт в этом же PR.Test plan
import app.main; import app.scheduler_main— OKruff checkclean (pinned 0.7.4); grep — 0 рантайм-импортёров удалённых функцийPost-merge: qa-smoke на
tradein-scraper— kit-scheduler тикает + джоба фаерится.Refs #2397, #2277
Deep-review нашёл: удалённый test_kit_registry_completeness.py заменялся test_routing_coverage_sets_match, но тот строил registry ИЗ хардкоженного _PRODUCT_SOURCES через recording-stub и проверял тот же набор — тавтология, не гоняющая реальный build_product_handlers(). Плюс _PRODUCT_SOURCES был устаревшим: не хватало cian_history_backfill, deals_freshness_monitor, osm_poi_ekb_refresh (все три есть в реальном build_product_handlers). Фикс: - _PRODUCT_SOURCES дополнен тремя пропущенными source'ами, сверен построчным grep '"...": Handler(' по product_handlers.py (20 exact + 1 wildcard). Список остаётся canonical hardcode (источник правды — сам product_handlers.py + scrape_schedules seed-миграции), с явным комментарием "поддерживается вручную". - test_routing_coverage_sets_match удалён, заменён test_real_build_product_handlers_covers_all_scheduled_sources: зовёт РЕАЛЬНЫЙ product_handlers.build_product_handlers(ctx=None) + build_registry (не stub), ассертит resolve_handler для каждого source из _PRODUCT_SOURCES ∪ _KIT_NATIVE_SOURCES. Уроненная handler-entry или scheduled source без handler'а теперь роняет CI. Регресс-пруф (сделан вручную, откачен): временно закомментировал "osm_poi_ekb_refresh" в build_product_handlers → новый тест упал с "misses source=osm_poi_ekb_refresh"; вернул строку → тест снова зелёный (git diff на product_handlers.py пуст после отката). Verify: full pytest 3179 passed / 6 skipped / 1 known-unrelated fail (test_search_cache_hit, #2208); ruff 0.7.4 чист на изменённых файлах.