fix(celery): disable nspd-harvest beat (Bug post-mortem #1, time-sensitive) #121

Merged
lekss361 merged 1 commit from fix/disable-nspd-harvest-beat into main 2026-05-14 20:24:53 +00:00
lekss361 commented 2026-05-14 20:18:28 +00:00 (Migrated from github.com)

Summary

Time-sensitive: disable Celery beat nspd-harvest-stale-quarters ДО next Monday (2026-05-18 04:00 МСК), когда оно автоматически запустится и сольёт rate-limit budget + заполнит DB мусором.

Per fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md action item #1 — disable до Sprint 2 fix.

Root cause (из vault post-mortem)

harvest_quarter Celery task в текущей реализации пишет почти пустые dumps в nspd_quarter_dumps из-за single-pixel WMS GetFeatureInfo bug (get_features_in_bbox returns 0-3 features под центральным пикселем, не bulk).

Beat schedule nspd-harvest-stale-quarters (Mon 04:00 МСК):

  • Fanout'ит harvest_quarter.apply_async() по ~12k кварталам ЕКБ старше 90 дней
  • Batch 50 × 600ms rate = ~5 минут per batch × 240 batches = ~20 часов сплошных запросов
  • Все пишут почти пустые rows → quarter_dump_lookup.get_quarter_dump_dataanalyze_parcel) начнёт возвращать пустые nspd_zoning, nspd_zouit_overlaps, nspd_engineering_nearby для ВСЕХ пользователей

What changed

backend/app/workers/celery_app.py — закомментирован один beat schedule entry (~10 строк) с inline reference на vault post-mortem.

What НЕ changed

  • Task code (backend/app/workers/tasks/nspd_sync.py) — остаётся работающим
  • Admin endpoint для manual trigger — работает
  • Все остальные 6 beat tasks (poi-sync, noise-sync, zombie-cleanup, refresh-medians, kn-region-*) — не тронуты

Re-enable strategy

После Sprint 2 grid-sampling rewrite:

  1. Переписать NSPDClient.get_features_in_bboxsample_features_grid(layer_id, bbox, grid_n=15) per post-mortem Option A/B
  2. Verify через staging (manual trigger через admin endpoint, проверить что dumps не пустые)
  3. Uncomment beat schedule в celery_app.py

Test plan

  • ruff check passed
  • Verify deploy NOT triggers beat next Monday (docker compose logs beat после deploy)
  • celery -A app.workers.celery_app inspect scheduled показывает 6 entries без nspd-harvest-stale-quarters
  • vault: fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md (status identifiedmitigated)
  • Sprint 2 ToDo: grid sampling rewrite

Priority: high — должно merge'нуться ДО 2026-05-18 04:00 МСК (через ~3 дня).

## Summary **Time-sensitive:** disable Celery beat `nspd-harvest-stale-quarters` ДО next Monday (2026-05-18 04:00 МСК), когда оно автоматически запустится и сольёт rate-limit budget + заполнит DB мусором. Per `fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md` action item #1 — disable до Sprint 2 fix. ## Root cause (из vault post-mortem) `harvest_quarter` Celery task в текущей реализации пишет **почти пустые dumps** в `nspd_quarter_dumps` из-за single-pixel WMS GetFeatureInfo bug (`get_features_in_bbox` returns 0-3 features под центральным пикселем, не bulk). Beat schedule `nspd-harvest-stale-quarters` (Mon 04:00 МСК): - Fanout'ит `harvest_quarter.apply_async()` по ~12k кварталам ЕКБ старше 90 дней - Batch 50 × 600ms rate = ~5 минут per batch × 240 batches = ~20 часов сплошных запросов - Все пишут почти пустые rows → `quarter_dump_lookup.get_quarter_dump_data` (в `analyze_parcel`) начнёт возвращать пустые `nspd_zoning`, `nspd_zouit_overlaps`, `nspd_engineering_nearby` **для ВСЕХ пользователей** ## What changed `backend/app/workers/celery_app.py` — закомментирован один beat schedule entry (~10 строк) с inline reference на vault post-mortem. ## What НЕ changed - Task code (`backend/app/workers/tasks/nspd_sync.py`) — остаётся работающим - Admin endpoint для manual trigger — работает - Все остальные 6 beat tasks (poi-sync, noise-sync, zombie-cleanup, refresh-medians, kn-region-*) — не тронуты ## Re-enable strategy После Sprint 2 grid-sampling rewrite: 1. Переписать `NSPDClient.get_features_in_bbox` → `sample_features_grid(layer_id, bbox, grid_n=15)` per post-mortem Option A/B 2. Verify через staging (manual trigger через admin endpoint, проверить что dumps не пустые) 3. Uncomment beat schedule в `celery_app.py` ## Test plan - [x] `ruff check` passed - [ ] Verify deploy NOT triggers beat next Monday (`docker compose logs beat` после deploy) - [ ] `celery -A app.workers.celery_app inspect scheduled` показывает 6 entries без `nspd-harvest-stale-quarters` ## Related - vault: `fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md` (status `identified` → `mitigated`) - Sprint 2 ToDo: grid sampling rewrite **Priority: high** — должно merge'нуться ДО 2026-05-18 04:00 МСК (через ~3 дня).
lekss361 commented 2026-05-14 20:19:52 +00:00 (Migrated from github.com)

Bot review

Хирургический change: 1 файл, 7 строк кода закомментировано + объясняющий комментарий. Анализ:

Минимально-инвазивный — только beat schedule entry закомментирован, task code (tasks/nspd_sync.py) и admin endpoint для ручного trigger остаются работающими.

Inline ссылка на post-mortem в комментарии — будущий читатель поймёт почему и когда re-enable (после Sprint 2 grid sampling rewrite).

Time-sensitive обоснован: следующий fire запланирован Mon 2026-05-18 04:00 МСК, до этого ~3 дня. Без disable будет ~20 часов rate-limit drain + filling nspd_quarter_dumps мусором → broken analyze_parcel для всех пользователей.

Остальные 6 beat tasks не тронуты (poi-sync, noise-sync, zombie-cleanup, refresh-medians, kn-region-*).

Reversal trivial — uncomment 7 строк когда grid-sampling готов.

Минор

Структура «keep code, comment out schedule» правильная — НЕ удалять task definition. Когда переписывать на grid sampling, hash логики harvest_stale_quarters хорошо иметь под рукой для diff.

CI status

  • frontend: 🔄 IN_PROGRESS
  • backend: 🔄 IN_PROGRESS

Мерджу как только оба зелёные.

## Bot review Хирургический change: 1 файл, 7 строк кода закомментировано + объясняющий комментарий. Анализ: ✅ **Минимально-инвазивный** — только beat schedule entry закомментирован, task code (`tasks/nspd_sync.py`) и admin endpoint для ручного trigger остаются работающими. ✅ **Inline ссылка на post-mortem** в комментарии — будущий читатель поймёт почему и когда re-enable (после Sprint 2 grid sampling rewrite). ✅ **Time-sensitive обоснован**: следующий fire запланирован Mon 2026-05-18 04:00 МСК, до этого ~3 дня. Без disable будет ~20 часов rate-limit drain + filling nspd_quarter_dumps мусором → broken `analyze_parcel` для всех пользователей. ✅ **Остальные 6 beat tasks не тронуты** (poi-sync, noise-sync, zombie-cleanup, refresh-medians, kn-region-*). ✅ **Reversal trivial** — uncomment 7 строк когда grid-sampling готов. ### Минор Структура «keep code, comment out schedule» правильная — НЕ удалять task definition. Когда переписывать на grid sampling, hash логики `harvest_stale_quarters` хорошо иметь под рукой для diff. ### CI status - frontend: 🔄 IN_PROGRESS - backend: 🔄 IN_PROGRESS **Мерджу как только оба зелёные.**
lekss361 commented 2026-05-14 20:24:02 +00:00 (Migrated from github.com)

Final review (SHA ecf9f56, CI )

  • backend: SUCCESS (20:19:48Z)
  • frontend: SUCCESS (20:20:13Z)
  • Time-sensitive merge — успеваем за ~3 дня до Mon 04:00 МСК

approve merge

## Final review (SHA `ecf9f56`, CI ✅) - backend: SUCCESS (20:19:48Z) - frontend: SUCCESS (20:20:13Z) - Time-sensitive merge — успеваем за ~3 дня до Mon 04:00 МСК approve merge
lekss361 commented 2026-05-14 20:27:48 +00:00 (Migrated from github.com)

Tracking: part of audit batch #127. Closes vault action item #1 of fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md. Related Sprint 2 fix: #126.

Tracking: part of audit batch #127. Closes vault action item #1 of `fixes/Bug_NSPD_WMS_NotBulk_2026_May14.md`. Related Sprint 2 fix: #126.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#121
No description provided.