fix(site_finder): SAVEPOINT-isolate quarter-dump lookup db.execute (#2464 Wave 2) #2467

Merged
bot-backend merged 1 commit from worktree-agent-aa1fb22f5cd3eb4a8 into main 2026-07-08 06:30:33 +00:00
Collaborator

Что

Волна 2 эпика #2464, часть 1/3 — quarter_dump_lookup.py (11 swallow-сайтов). Найдено completeness-sweep'ом (46 агентов, adversarial-verified), который выявил, что exhaustive-review пропустил бóльшую часть кластера A.

Баг-класс

Хелперы _get_* последовательно исполняются в get_quarter_dump_data(db, …) на общей /analyze-сессии (parcels.py:2575, Depends(get_db)). Каждый ловил сбой db.execute и возвращал фолбэк без rollback → Postgres держит транзакцию aborted → следующие _get_* на том же db, а также downstream get_or_fetch_zone_regulation (parcels.py:2619) и поздний begin_nested-блок «9f cad_parcels» падают current transaction is aborted / PendingRollbackError.

Фикс

SAVEPOINT (with db.begin_nested():) на каждом swallow-сайте (11 шт.):
_get_zoning · _get_zouit_overlaps · _get_cad_zouit_overlaps · _get_engineering_nearby · _get_risk_zones · _get_opportunity_parcels · _get_red_lines · _get_engineering_structures_by_boundary (2 независимых savepoint — COUNT + row-fetch) · _get_zouit_engineering_overlaps (2 независимых).

Два сайта с двумя db.execute под одним except получили по savepoint на каждый execute — иначе RELEASE-trap (внешний RELEASE падает в aborted-tx). get_connection_points и _get_parcel_wkt подтверждены already-safe (их db.execute пропагирует, не глотает — на ошибке весь запрос падает, сессию не отравляет). Фолбэки и типы except байт-в-байт неизменны.

Тесты

Новый test_quarter_dump_savepoint.py (14 тестов): для репрезентативного набора (вкл. оба two-savepoint-случая) — фолбэк сохранён · begin_nested реально вызван (для two-savepoint: call_count == 2) · сессия usable после сбоя. Тесты честно раскрывают, что MagicMock ≠ реальная aborted-tx Postgres (калиброванный caveat). tests/services/site_finder/ + legacy = 648 passed, ruff чисто.

Ревью

code-reviewer: APPROVE, ноль блокеров. Все 15 db.execute в файле сверены с begin_nested (11 обёрнуто + 4 non-swallowing), shape SAVEPOINT корректен везде, two-savepoint-сайты — независимые, ноль поведенческого дрейфа (92 legacy-теста без изменений), нет :x::type, нет tradein.

Refs #2464 (cluster A, Wave 2 · 1/3).

## Что Волна 2 эпика **#2464**, часть 1/3 — `quarter_dump_lookup.py` (11 swallow-сайтов). Найдено completeness-sweep'ом (46 агентов, adversarial-verified), который выявил, что exhaustive-review пропустил бóльшую часть кластера A. ### Баг-класс Хелперы `_get_*` последовательно исполняются в `get_quarter_dump_data(db, …)` на **общей** `/analyze`-сессии (`parcels.py:2575`, `Depends(get_db)`). Каждый ловил сбой `db.execute` и возвращал фолбэк **без rollback** → Postgres держит транзакцию `aborted` → следующие `_get_*` на том же `db`, а также downstream `get_or_fetch_zone_regulation` (parcels.py:2619) и поздний `begin_nested`-блок «9f cad_parcels» падают `current transaction is aborted` / `PendingRollbackError`. ### Фикс SAVEPOINT (`with db.begin_nested():`) на **каждом** swallow-сайте (11 шт.): `_get_zoning` · `_get_zouit_overlaps` · `_get_cad_zouit_overlaps` · `_get_engineering_nearby` · `_get_risk_zones` · `_get_opportunity_parcels` · `_get_red_lines` · `_get_engineering_structures_by_boundary` (**2 независимых** savepoint — COUNT + row-fetch) · `_get_zouit_engineering_overlaps` (**2 независимых**). Два сайта с двумя `db.execute` под одним `except` получили **по savepoint на каждый execute** — иначе RELEASE-trap (внешний RELEASE падает в aborted-tx). `get_connection_points` и `_get_parcel_wkt` подтверждены **already-safe** (их `db.execute` пропагирует, не глотает — на ошибке весь запрос падает, сессию не отравляет). Фолбэки и типы `except` байт-в-байт неизменны. ## Тесты Новый `test_quarter_dump_savepoint.py` (14 тестов): для репрезентативного набора (вкл. оба two-savepoint-случая) — фолбэк сохранён · `begin_nested` реально вызван (для two-savepoint: `call_count == 2`) · сессия usable после сбоя. Тесты честно раскрывают, что `MagicMock` ≠ реальная aborted-tx Postgres (калиброванный caveat). `tests/services/site_finder/` + legacy = **648 passed**, ruff чисто. ## Ревью code-reviewer: **✅ APPROVE**, ноль блокеров. Все 15 `db.execute` в файле сверены с `begin_nested` (11 обёрнуто + 4 non-swallowing), shape SAVEPOINT корректен везде, two-savepoint-сайты — независимые, ноль поведенческого дрейфа (92 legacy-теста без изменений), нет `:x::type`, нет tradein. Refs #2464 (cluster A, Wave 2 · 1/3).
bot-backend added 1 commit 2026-07-08 06:11:17 +00:00
fix(backend): wrap quarter-dump lookup db.execute in SAVEPOINTs (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m2s
CI / backend-tests (pull_request) Successful in 15m1s
7f0ea1bb8b
11 db.execute swallow sites across the _get_* helpers in
quarter_dump_lookup.py caught failures without a savepoint, aborting the
shared /analyze request session for sibling helpers and downstream
queries (get_or_fetch_zone_regulation, the 9f cad_parcels begin_nested
block). Wrap each in db.begin_nested(); _get_engineering_structures_by_
boundary and _get_zouit_engineering_overlaps get two independent
savepoints (one per db.execute) per the RELEASE SAVEPOINT trap.
get_connection_points and _get_parcel_wkt confirmed already-safe (their
db.execute propagates, not swallows). Adds regression tests.

Refs #2464 (cluster A session-poisoning, Wave 2).
bot-backend merged commit 22f3c44dc2 into main 2026-07-08 06:30:33 +00:00
bot-backend deleted branch worktree-agent-aa1fb22f5cd3eb4a8 2026-07-08 06:30:33 +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#2467
No description provided.