fix(22d): commit outer transaction in scrape_catalog_objects orchestrator #342

Merged
lekss361 merged 1 commit from fix/22d-catalog-objects-missing-commit into main 2026-05-17 22:13:50 +00:00
Owner

Summary

PR #335 использовал with db.begin_nested(): SAVEPOINT для per-row UPDATE, но outer transaction никогда не commit'ился.

Целевая последовательность была:

  1. Celery task: db = SessionLocal() (autocommit=False)
  2. Передаёт db в scrape_catalog_objects(db, ...)
  3. Per-obj: with db.begin_nested(): SAVEPOINT → UPDATE
  4. После loop: return stats
  5. Celery finally: db.close()закрывает session без commit → outer autobegin'd tx rollback → все UPDATE'ы теряются

Симптом: task завершается успешно (processed=3 succeeded=3), Glitchtip пустой (нет exception), но в БД 0 строк с catalog_scraped_at != NULL.

Fix

Добавлен db.commit() после batch loop, с rollback fallback:

try:
    db.commit()
except Exception:
    db.rollback()
    raise

Test plan

  • Ruff clean
  • Post-deploy: retrigger POST /admin/scrape/kn-catalog-objects {"max_objects":3} → проверить что wall_type/energy_eff/ceiling_height_m появились для 3 obj.
## Summary PR #335 использовал `with db.begin_nested():` SAVEPOINT для per-row UPDATE, но **outer transaction никогда не commit'ился**. Целевая последовательность была: 1. Celery task: `db = SessionLocal()` (autocommit=False) 2. Передаёт db в `scrape_catalog_objects(db, ...)` 3. Per-obj: `with db.begin_nested():` SAVEPOINT → UPDATE 4. После loop: return stats 5. Celery finally: `db.close()` — **закрывает session без commit** → outer autobegin'd tx rollback → все UPDATE'ы теряются **Симптом**: task завершается успешно (`processed=3 succeeded=3`), Glitchtip пустой (нет exception), но в БД 0 строк с `catalog_scraped_at != NULL`. ## Fix Добавлен `db.commit()` после batch loop, с rollback fallback: ```python try: db.commit() except Exception: db.rollback() raise ``` ## Test plan - [x] Ruff clean - [ ] Post-deploy: retrigger `POST /admin/scrape/kn-catalog-objects {"max_objects":3}` → проверить что `wall_type/energy_eff/ceiling_height_m` появились для 3 obj.
lekss361 added 1 commit 2026-05-17 22:10:25 +00:00
PR #335 использовал `with db.begin_nested():` SAVEPOINT для per-row UPDATE,
но outer transaction никогда не commit'ился. После цикла Celery task
закрывал session (`db.close()` в finally) → autobegin'd outer tx
rollback → все UPDATE'ы теряются.

Симптом: task завершается с processed=3 succeeded=3, в Glitchtip нет ошибок,
но в БД ни одного catalog_scraped_at != NULL.

Fix: добавлен db.commit() после цикла + rollback на ошибку commit'а.
Author
Owner

Deep review — APPROVE

Fix is correctly placed (after batch loop at line 452, before logger/stats return) and uses proper SQLAlchemy hygiene (commit / except / rollback / raise). No scope creep — SAVEPOINT pattern, Celery lifecycle, and orchestrator signature untouched. Resolves silent data loss where outer autobegin'd tx rolled back at db.close() discarding all per-row UPDATEs.

Merging.

Deep review — APPROVE Fix is correctly placed (after batch loop at line 452, before logger/stats return) and uses proper SQLAlchemy hygiene (commit / except / rollback / raise). No scope creep — SAVEPOINT pattern, Celery lifecycle, and orchestrator signature untouched. Resolves silent data loss where outer autobegin'd tx rolled back at db.close() discarding all per-row UPDATEs. Merging.
lekss361 merged commit 05b6966a5f into main 2026-05-17 22:13:50 +00:00
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#342
No description provided.