From ecf9f568cb962e9682ea36aaee4381df499421cd Mon Sep 17 00:00:00 2001 From: lekss361 Date: Thu, 14 May 2026 23:18:01 +0300 Subject: [PATCH] fix(celery): disable nspd-harvest-stale-quarters beat (Bug post-mortem #1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per fixes/Bug_NSPD_WMS_NotBulk_2026_May14 action item #1: отключить beat schedule `nspd-harvest-stale-quarters` до Sprint 2 fix (grid sampling rewrite). ## Why harvest_quarter в текущей реализации пишет почти пустые dumps в nspd_quarter_dumps из-за single-pixel WMS GetFeatureInfo bug (детали в vault post-mortem). Beat запуск Mon 04:00 МСК (next: 2026-05-18 04:00 МСК): - Потратит rate-limit budget на ~12k EKB кварталов - Заполнит nspd_quarter_dumps мусорными rows - analyze_parcel начнёт отдавать пустые nspd_zoning/nspd_zouit_overlaps/ nspd_engineering_nearby для всех пользователей (через quarter_dump_lookup) ## What changed `backend/app/workers/celery_app.py` — закомментирован `schedule[ "nspd-harvest-stale-quarters"]` блок (~10 строк) с inline-комментом explanation + ссылкой на vault post-mortem. ## What НЕ changed - `backend/app/workers/tasks/nspd_sync.py` — task code (harvest_quarter, harvest_stale_quarters) остаётся, можно re-enable после Sprint 2 fix - Admin endpoint для manual trigger остаётся работающим - Все остальные beat tasks (poi-sync, noise-sync, zombie-cleanup, refresh-ekb-districts-medians, kn-region-*) — не тронуты ## Vault - fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md — status `identified` → `mitigated` (уже обновлено через vault audit pass) ## Re-enable После Sprint 2 grid-sampling rewrite (см. Bug post-mortem → Sprint 2 fix-strategy) — uncomment блок + verify через staging. --- backend/app/workers/celery_app.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/backend/app/workers/celery_app.py b/backend/app/workers/celery_app.py index afa18809..7adb9afa 100644 --- a/backend/app/workers/celery_app.py +++ b/backend/app/workers/celery_app.py @@ -231,16 +231,24 @@ def _build_beat_schedule() -> dict: "options": {"queue": "celery"}, } - # NSPD quarter dump refresh — понедельник 04:00 МСК. - # Fanout'ит harvest_quarter.apply_async для кварталов старше 90 дней или - # отсутствующих в nspd_quarter_dumps. batch_size=50 — ~5 мин при 600ms rate. - # Запускается через час после poi-sync чтобы не создавать конкуренцию. - schedule["nspd-harvest-stale-quarters"] = { - "task": "tasks.nspd_sync.harvest_stale_quarters", - "schedule": _parse_cron("0 4 * * mon"), - "kwargs": {"region_code": 66, "max_age_days": 90, "batch_size": 50}, - "options": {"queue": "celery"}, - } + # NSPD quarter dump refresh — DISABLED 2026-05-14 per Bug_NSPD_WMS_NotBulk + # post-mortem (vault: fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md). + # + # Action item #1: disable beat schedule до Sprint 2 fix (grid sampling + # rewrite). harvest_quarter в текущей реализации пишет почти пустые dumps + # из-за single-pixel WMS GetFeatureInfo bug. Запуск Mon 04:00 МСК потратит + # rate-limit budget и заполнит nspd_quarter_dumps мусором. + # + # Task code остаётся в tasks/nspd_sync.py — re-enable после Sprint 2 grid + # sampling rewrite (см. Bug_NSPD_WMS_NotBulk_2026_May14 → Sprint 2 fix-strategy). + # До тех пор harvest_quarter можно вызывать вручную через admin endpoint. + # + # schedule["nspd-harvest-stale-quarters"] = { + # "task": "tasks.nspd_sync.harvest_stale_quarters", + # "schedule": _parse_cron("0 4 * * mon"), + # "kwargs": {"region_code": 66, "max_age_days": 90, "batch_size": 50}, + # "options": {"queue": "celery"}, + # } return schedule -- 2.45.3