[Fable 5][P3] scrape_catalog_batch не делает db.commit() — все UPDATE цен откатятся при закрытии сессии #1227

Closed
opened 2026-06-13 04:49:46 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (data-integrity), confidence 0.6.

Файл

backend/app/services/scrapers/domrf_catalog.py:409

Evidence (цитата кода)

try:
    with db.begin_nested():
        result = db.execute(
            text(
                """
                UPDATE domrf_kn_flats SET
                  catalog_url_hash   = :catalog_url_hash,

Why bug

begin_nested() только освобождает SAVEPOINT; ни upsert_catalog_data, ни scrape_catalog_batch (entry-point модуля, конец на line 563) не вызывают db.commit(). Вызов по документированной схеме (Celery task из docstring) отчитается success, но при db.close() все UPDATE цен/отделки откатятся — тихая потеря батча. Sibling domrf_catalog_object.py:457-461 явно добавил commit с комментом об этом. Callers пока нет — latent, поэтому P3.

Suggested fix

После цикла в scrape_catalog_batch добавить try: db.commit() / except: db.rollback(); raise — зеркально scrape_catalog_objects из domrf_catalog_object.py.

Verify notes

  • [real/P3] Трасса по конвенции репо: sibling-таска scrape_kn_catalog_objects.py делает SessionLocal→asyncio.run(batch)→db.close() БЕЗ commit — commit обязан жить в batch-функции. В domrf_catalog.py begin_nested лишь RELEASE SAVEPOINT, db.commit() отсутствует во всём файле → при db.close() outer tx откатится: батч отчитается success, все UPDATE цен потеряны, catalog_updated_at тоже откатится (вечный re-scrape). Но callers нет (workers/tasks/scrape_catalog.py не существует) — latent, P3.
  • [real/P3] Защита не найдена: в domrf_catalog.py нет ни одного commit/rollback; begin_nested() лишь освобождает SAVEPOINT, outer tx остаётся. SessionLocal(autocommit=False); Celery-шаблон проекта (scrape_kn_catalog_objects.py) делает только db.close() в finally, полагаясь на commit в сервисе → весь батч откатится молча при stats success>0. Sibling domrf_catalog_object.py:457-461 сам коммитит и комментом фиксирует ровно этот режим отказа. Callers нет (scrape_catalog.py не существует) → latent, P3 честен.

Provenance

  • Finders: scrapers
  • Confidence: 0.6
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (data-integrity), confidence 0.6. ## Файл [`backend/app/services/scrapers/domrf_catalog.py:409`](backend/app/services/scrapers/domrf_catalog.py:409) ## Evidence (цитата кода) ``` try: with db.begin_nested(): result = db.execute( text( """ UPDATE domrf_kn_flats SET catalog_url_hash = :catalog_url_hash, ``` ## Why bug begin_nested() только освобождает SAVEPOINT; ни upsert_catalog_data, ни scrape_catalog_batch (entry-point модуля, конец на line 563) не вызывают db.commit(). Вызов по документированной схеме (Celery task из docstring) отчитается success, но при db.close() все UPDATE цен/отделки откатятся — тихая потеря батча. Sibling domrf_catalog_object.py:457-461 явно добавил commit с комментом об этом. Callers пока нет — latent, поэтому P3. ## Suggested fix После цикла в scrape_catalog_batch добавить try: db.commit() / except: db.rollback(); raise — зеркально scrape_catalog_objects из domrf_catalog_object.py. ## Verify notes - [real/P3] Трасса по конвенции репо: sibling-таска scrape_kn_catalog_objects.py делает SessionLocal→asyncio.run(batch)→db.close() БЕЗ commit — commit обязан жить в batch-функции. В domrf_catalog.py begin_nested лишь RELEASE SAVEPOINT, db.commit() отсутствует во всём файле → при db.close() outer tx откатится: батч отчитается success, все UPDATE цен потеряны, catalog_updated_at тоже откатится (вечный re-scrape). Но callers нет (workers/tasks/scrape_catalog.py не существует) — latent, P3. - [real/P3] Защита не найдена: в domrf_catalog.py нет ни одного commit/rollback; begin_nested() лишь освобождает SAVEPOINT, outer tx остаётся. SessionLocal(autocommit=False); Celery-шаблон проекта (scrape_kn_catalog_objects.py) делает только db.close() в finally, полагаясь на commit в сервисе → весь батч откатится молча при stats success>0. Sibling domrf_catalog_object.py:457-461 сам коммитит и комментом фиксирует ровно этот режим отказа. Callers нет (scrape_catalog.py не существует) → latent, P3 честен. ## Provenance - Finders: `scrapers` - Confidence: 0.6 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:46 +00:00
Sign in to join this conversation.
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#1227
No description provided.