fix(sf): per-quarter commit в ird/opportunity harvest — не терять прогресс при краше (#1067) #1107

Merged
bot-reviewer merged 1 commit from fix/1067-harvest-per-quarter-commit into main 2026-06-06 21:47:35 +00:00
Owner

Реальный баг, пойман при активации на проде (2026-06-07)

При первом полном прогоне на проде harvest_ird_overlays + harvest_opportunity_overlays получили задачу 21:17, grid-walk'или НСПД, затем остановились без succeeded и без единой записи (ird_overlays остался =6 от smoke). Причина — db.commit() стоял ОДИН раз в самом конце задачи: длинный grid-walk по всем кварталам ЕКБ (часы, тысячи rate-limited WMS-запросов) при краше/таймауте/WorkerLost середины прогона терял ВЕСЬ прогресс. (Тот же эффект ранее: zone-reg при обрыве сессии потерял прогон.)

Фикс

ird_harvest + opportunity_harvest: commit после КАЖДОГО квартала (после layer-loop, внутри per-quarter try) + db.rollback() в except перед continue (сбросить незакоммиченный tx битого квартала). Финальный commit оставлен как подстраховка.

  • Теперь прогресс durable поквартально: краш на N-м квартале сохраняет первые N-1.
  • SAVEPOINT per-row (begin_nested) не тронут — изоляция битой фичи остаётся.

Валидация

  • pytest test_ird_harvest.py test_opportunity_harvest.py8 passed, +2 новых:
    • test_per_quarter_commit_durability — 2 квартала → commit_count >= 2 (не «раз в конце»).
    • test_quarter_failure_rolls_back_and_continues — сбой квартала → rollback + продолжение, остальные коммитятся.
  • ruff clean.

После merge

Передеплоится → перезапущу полный прогон harvest на проде (теперь наполнит ird_overlays/opportunity инкрементально, переживёт обрывы). Сейчас на проде: planning=1170, zone_regulation_cache=33, ird_overlays=6 (smoke), флаг enable_ird_analyze=true уже включён.

Scope: только 2 worker-файла + тесты. НЕ трогает parcels.py.

## Реальный баг, пойман при активации на проде (2026-06-07) При первом полном прогоне на проде `harvest_ird_overlays` + `harvest_opportunity_overlays` получили задачу 21:17, grid-walk'или НСПД, затем **остановились без `succeeded` и без единой записи** (`ird_overlays` остался =6 от smoke). Причина — `db.commit()` стоял **ОДИН раз в самом конце** задачи: длинный grid-walk по всем кварталам ЕКБ (часы, тысячи rate-limited WMS-запросов) при краше/таймауте/`WorkerLost` середины прогона терял **ВЕСЬ** прогресс. (Тот же эффект ранее: zone-reg при обрыве сессии потерял прогон.) ## Фикс `ird_harvest` + `opportunity_harvest`: **commit после КАЖДОГО квартала** (после layer-loop, внутри per-quarter try) + `db.rollback()` в except перед `continue` (сбросить незакоммиченный tx битого квартала). Финальный commit оставлен как подстраховка. - Теперь прогресс durable поквартально: краш на N-м квартале сохраняет первые N-1. - SAVEPOINT per-row (`begin_nested`) не тронут — изоляция битой фичи остаётся. ## Валидация - `pytest test_ird_harvest.py test_opportunity_harvest.py` → **8 passed**, +2 новых: - `test_per_quarter_commit_durability` — 2 квартала → `commit_count >= 2` (не «раз в конце»). - `test_quarter_failure_rolls_back_and_continues` — сбой квартала → `rollback` + продолжение, остальные коммитятся. - `ruff` clean. ## После merge Передеплоится → перезапущу полный прогон harvest на проде (теперь наполнит `ird_overlays`/opportunity инкрементально, переживёт обрывы). Сейчас на проде: planning=1170, zone_regulation_cache=33, ird_overlays=6 (smoke), флаг `enable_ird_analyze=true` уже включён. Scope: только 2 worker-файла + тесты. НЕ трогает `parcels.py`.
lekss361 added 1 commit 2026-06-06 21:43:36 +00:00
fix(sf): per-quarter commit в ird/opportunity harvest — не терять прогресс при краше (#1067)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / changes (push) Successful in 6s
CI / backend-tests (push) Successful in 5m47s
CI / backend-tests (pull_request) Successful in 5m44s
fe452e3f31
lekss361 added the
GG-форсайт
scope/backend
site-finder
status/review
labels 2026-06-06 21:43:43 +00:00
bot-reviewer reviewed 2026-06-06 21:47:28 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — durability-фикс реального прод-бага (single end-commit терял весь прогресс при краше середины многочасового grid-walk).

  • Корректно: db.commit() per-quarter внутри per-quarter try (после layer-loop) → прогресс durable поквартально; db.rollback() в except перед continue → сбрасывает незакоммиченный tx битого квартала (изоляция); финальный commit-подстраховка (пустой список).
  • SAVEPOINT per-row (begin_nested) не тронут — per-feature изоляция остаётся; quarter-commit финализирует outer-tx, следующий квартал начинает fresh tx на первом execute. Взаимодействие корректно.
  • Если сам quarter-commit упадёт (DB lost) → except → rollback → continue. Robust.
  • Симметрично в обоих файлах (ird + opportunity). Только 2 worker-файла, parcels.py не тронут.
  • 2 non-vacuous теста: commit_count>=2 (не «раз в конце»), flaky-quarter → rollback_count>=1 + продолжение + остальные коммитятся. 8 passed.

Прямо чинит прод-инцидент (harvest остановился без записей). Merge → передеплой → re-run harvest.

Merge → deploy-verify.

<!-- gendesign-review-bot: sha=fe452e3 verdict=approve --> ✅ **APPROVE** — durability-фикс реального прод-бага (single end-commit терял весь прогресс при краше середины многочасового grid-walk). - **Корректно**: `db.commit()` per-quarter внутри per-quarter try (после layer-loop) → прогресс durable поквартально; `db.rollback()` в except перед continue → сбрасывает незакоммиченный tx битого квартала (изоляция); финальный commit-подстраховка (пустой список). - **SAVEPOINT per-row (`begin_nested`) не тронут** — per-feature изоляция остаётся; quarter-commit финализирует outer-tx, следующий квартал начинает fresh tx на первом execute. Взаимодействие корректно. - Если сам quarter-commit упадёт (DB lost) → except → rollback → continue. Robust. - **Симметрично** в обоих файлах (ird + opportunity). Только 2 worker-файла, parcels.py не тронут. - 2 non-vacuous теста: `commit_count>=2` (не «раз в конце»), flaky-quarter → `rollback_count>=1` + продолжение + остальные коммитятся. 8 passed. Прямо чинит прод-инцидент (harvest остановился без записей). Merge → передеплой → re-run harvest. Merge → deploy-verify.
bot-reviewer merged commit fe7727e338 into main 2026-06-06 21:47:35 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#1107
No description provided.