From d4da1b26c620e1cd2b2c92a41b9c99d15cb89093 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sun, 17 May 2026 10:37:07 +0300 Subject: [PATCH] fix(#231): re-enable nspd-harvest-stale-quarters beat schedule (Sub-PR D) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После Sub-PR B (#260, merged 8ebcd15) переключения search_by_quarter на grid-walk dispatch — beat schedule безопасно re-enable'ить: - harvest_quarter возвращает полноценные dumps (territorial_zones + ЗОУИТ + risk zones + engineering structures) вместо 0-3 features - per-instance semaphore (PR #260) защищает от cross-loop binding bug - soft/hard time_limit 600/900s — задача успевает завершиться Schedule: Mon 01:00 UTC (04:00 МСК), batch_size=50 ограничивает WAF burst, max_age_days=90 для регулярного refresh + новые quarters (fetched_at IS NULL). Полный ЕКБ back-fill (11k+ quarters в cad_quarters_geom) займёт несколько недель при batch_size=50/week; в production будет ускорено manual trigger admin endpoint'ом если нужно. Closes #231. --- backend/app/workers/beat_schedule.py | 32 +++++++++++++--------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/backend/app/workers/beat_schedule.py b/backend/app/workers/beat_schedule.py index 50a06dfc..7aa9c341 100644 --- a/backend/app/workers/beat_schedule.py +++ b/backend/app/workers/beat_schedule.py @@ -237,23 +237,21 @@ def build_beat_schedule() -> dict: "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). + # NSPD quarter dump refresh — re-enabled 2026-05-17 после Sub-PR B (#260) + # переключения search_by_quarter на grid-walk. Foundation (#247) + integration + # (#260) теперь возвращают полноценные dumps (territorial_zones, ЗОУИТ, risk + # zones, engineering structures) вместо 0-3 features из single-pixel WMS. # - # 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"}, - # } + # Schedule: Mon 04:00 МСК (01:00 UTC). batch_size=50 ограничивает fanout per + # tick — при 11k+ кварталов в cad_quarters_geom полный backfill займёт + # несколько недель, но защищает от WAF rate-limit burst. + # max_age_days=90 — refresh свежее квартала; новые / отсутствующие dumps + # тоже попадают через harvest_stale_quarters (берёт NULL fetched_at). + schedule["nspd-harvest-stale-quarters"] = { + "task": "tasks.nspd_sync.harvest_stale_quarters", + "schedule": _parse_cron("0 1 * * mon"), # 01:00 UTC = 04:00 МСК + "kwargs": {"region_code": 66, "max_age_days": 90, "batch_size": 50}, + "options": {"queue": "celery"}, + } return schedule