fix(sf): per-quarter commit в ird/opportunity harvest — не терять прогресс при краше (#1067) #1107
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1107
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/1067-harvest-per-quarter-commit"
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?
Реальный баг, пойман при активации на проде (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 оставлен как подстраховка.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+ продолжение, остальные коммитятся.ruffclean.После merge
Передеплоится → перезапущу полный прогон harvest на проде (теперь наполнит
ird_overlays/opportunity инкрементально, переживёт обрывы). Сейчас на проде: planning=1170, zone_regulation_cache=33, ird_overlays=6 (smoke), флагenable_ird_analyze=trueуже включён.Scope: только 2 worker-файла + тесты. НЕ трогает
parcels.py.✅ APPROVE — durability-фикс реального прод-бага (single end-commit терял весь прогресс при краше середины многочасового grid-walk).
db.commit()per-quarter внутри per-quarter try (после layer-loop) → прогресс durable поквартально;db.rollback()в except перед continue → сбрасывает незакоммиченный tx битого квартала (изоляция); финальный commit-подстраховка (пустой список).begin_nested) не тронут — per-feature изоляция остаётся; quarter-commit финализирует outer-tx, следующий квартал начинает fresh tx на первом execute. Взаимодействие корректно.commit_count>=2(не «раз в конце»), flaky-quarter →rollback_count>=1+ продолжение + остальные коммитятся. 8 passed.Прямо чинит прод-инцидент (harvest остановился без записей). Merge → передеплой → re-run harvest.
Merge → deploy-verify.