gendesign/backend/app
bot-backend 2b646bc7e5
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-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 17m28s
fix(ptica): два запроса connection-capacity перестают травить общую сессию (#2464)
_query_power_points и _query_water_latest делали db.execute без SAVEPOINT, тогда
как четыре соседних _query_* в том же файле его имеют.

Пункт эпика указывал на другое место — отсутствие db.rollback() в except-блоке
_get_connection_capacity (full_report_pdf.py:217). Но плоский rollback на ОБЩЕЙ
сессии запрещён: он снёс бы работу вызывающего. Чинить надо там, где сбой
происходит, — как во всей волне #2464.

Цепочка целиком:

  сбой в _query_power_points
    → исключение всплывает (в get_connection_capacity try/except нет)
    → его глотает _get_connection_capacity ради деградации §3
    → транзакция остаётся aborted
    → падает уже СЛЕДУЮЩИЙ запрос — рыночная цена в _generate_concept_result
    → концепция молча уходит в class_norm-фолбэк

То есть отказ проявляется не там, где случился, и выглядит как «нет рыночных
данных». Ровно этот класс и описывает эпик.

Третье место (SET LOCAL statement_timeout в _query_nearby_network_zones) при
беглом поиске выглядит незащищённым, но лежит ВНУТРИ savepoint'а — проверено по
отступам, трогать не нужно.

Тест на PostgresLikeSession (tests/support/pg_session.py) — двойнике с настоящей
семантикой aborted-транзакции. На MagicMock он был бы зелёным по построению.
Против origin/main:

  следующий запрос после проглоченного сбоя  → AbortedTransactionError, ×2
  savepoints_entered = 0 вместо >=1          → падает, ×2
  двойник сам воспроизводит отравление       — контроль, зелёный с обеих сторон

Последний контроль не для симметрии: без него зелёные тесты нельзя отличить от
«двойник ничего не моделирует».

Прогоны: tests/services/site_finder + tests/services/exporters — 868 passed rc=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 14:30:29 +05:00
..
api fix(ptica): свежесть data-table источника считается по успешным строкам (#2956) (#2957) 2026-08-20 08:36:05 +00:00
core refactor(security): убрать мёртвую проверку админского токена (#2775) (#2776) 2026-08-07 09:30:23 +00:00
models merge: resolve conflicts with main (#1660) into week-review-finish 2026-06-17 20:21:06 +03:00
observability fix(ptica): скраб ПДн перестаёт утекать то, что защищает + проводка проверяется поведением (#2753) (#2787) 2026-08-07 10:11:36 +00:00
resources/certs feat(site-finder): ЕЭСК-резервы городских ПС/ТП + тепло из ФГИС ФАС (#2119 B2) (#2165) 2026-07-02 16:44:57 +00:00
schemas fix(site-finder): true-counts вместо молча-усечённых len(list) в connection-points/utility (#2445-A1/A2) (#2450) 2026-07-05 18:54:49 +00:00
scrapers fix(week-review): backend-аудит v2 — 82 фиксов (#1660) 2026-06-17 17:13:38 +00:00
services fix(ptica): два запроса connection-capacity перестают травить общую сессию (#2464) 2026-08-20 14:30:29 +05:00
templates fix(site-finder): 5 дефектов из боевого фидбека analyze (#1736 #1737 #1738 #1739 #1740) 2026-06-18 11:47:21 +05:00
workers docs(ptica): комментарии beat-расписания считали сдвиг МСК дважды (#2464-H) (#2866) 2026-08-13 12:26:44 +00:00
__init__.py init 2026-04-25 13:45:19 +03:00
main.py fix(health): не тащить HEAD-пробу в OpenAPI-схему 2026-08-15 19:22:22 +03:00