fix(ptica): загрузчик теплоснабжения фиксирует по организациям, а не одной транзакцией (#2464) #2973

Merged
bot-backend merged 1 commit from fix/2464-heat-loader-tx into main 2026-08-20 11:51:58 +00:00
Collaborator

Пункт эпика #2464: eias_heat_loader.py:519.

Дефект

for org, org_id in ORGS:          # восемь организаций
    out[org] = load_org_reserves(db, org, org_id)   # HTTP к внешнему реестру, таймаут 60с
db.commit()                        # ← один раз, в самом конце

Одна транзакция остаётся открытой на весь батч: держит соединение, тормозит vacuum, а падение в конце обнулило бы всё уже собранное.

Тонкость, из-за которой наивная правка была бы неверной

Функция умеет принимать чужую сессию (аргумент db). На ней коммитить по ходу нельзя — транзакцией распоряжается вызывающий, и промежуточный commit зафиксировал бы его работу. Ровно то же правило, что для плоского rollback на общей сессии.

Поэтому по-организационный commit только под owns_session; на чужой сессии поведение прежнее.

Заодно сбойная организация теперь откатывается, чтобы её частичные записи не уезжали в коммит следующей.

Достижимость

Загрузчик живой: 119 строк, 64 системы, последняя загрузка 18.08 (heat-reserves-sync-weekly, такт недельный).

Тесты

Считают коммиты на сессии-двойнике — то есть проверяют поведение, а не наличие символа. Против origin/main:

на своей сессии 1 коммит при 8 организациях       → падает
частичные записи сбойной организации не откачены  → падает
на ЧУЖОЙ сессии промежуточных коммитов нет  → контроль, зелёный с обеих сторон

Контроль не для симметрии: он ловит ровно ту наивную правку, что коммитила бы чужую транзакцию.

Прогоны

-k "heat or capacity"   117 passed   rc=0
Пункт эпика #2464: `eias_heat_loader.py:519`. ## Дефект ```python for org, org_id in ORGS: # восемь организаций out[org] = load_org_reserves(db, org, org_id) # HTTP к внешнему реестру, таймаут 60с db.commit() # ← один раз, в самом конце ``` Одна транзакция остаётся открытой на весь батч: держит соединение, тормозит vacuum, а падение в конце обнулило бы всё уже собранное. ## Тонкость, из-за которой наивная правка была бы неверной Функция умеет принимать **чужую** сессию (аргумент `db`). На ней коммитить по ходу нельзя — транзакцией распоряжается вызывающий, и промежуточный `commit` зафиксировал бы его работу. Ровно то же правило, что для плоского `rollback` на общей сессии. Поэтому по-организационный commit только под `owns_session`; на чужой сессии поведение прежнее. Заодно сбойная организация теперь откатывается, чтобы её частичные записи не уезжали в коммит следующей. ## Достижимость Загрузчик живой: 119 строк, 64 системы, последняя загрузка 18.08 (`heat-reserves-sync-weekly`, такт недельный). ## Тесты Считают коммиты на сессии-двойнике — то есть проверяют поведение, а не наличие символа. Против `origin/main`: ``` на своей сессии 1 коммит при 8 организациях → падает частичные записи сбойной организации не откачены → падает на ЧУЖОЙ сессии промежуточных коммитов нет → контроль, зелёный с обеих сторон ``` Контроль не для симметрии: он ловит ровно ту наивную правку, что коммитила бы чужую транзакцию. ## Прогоны ``` -k "heat or capacity" 117 passed rc=0 ```
bot-backend added 1 commit 2026-08-20 11:27:23 +00:00
fix(ptica): загрузчик теплоснабжения фиксирует по организациям, а не одной транзакцией (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
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 1m53s
CI / backend-tests (pull_request) Successful in 17m20s
d305e277ba
load_heat_reserves открывал сессию, проходил по восьми организациям — у каждой
несколько HTTP-раундов к медленному внешнему реестру ФАС с таймаутом 60с — и
коммитил ОДИН раз в самом конце. Одна транзакция оставалась открытой на всё это
время: держала соединение, тормозила vacuum, а падение в конце обнуляло бы всё
уже собранное.

Тонкость, из-за которой наивная правка была бы неверной: функция умеет принимать
ЧУЖУЮ сессию (аргумент db). На ней коммитить по ходу нельзя — транзакцией
распоряжается вызывающий, и промежуточный commit зафиксировал бы его работу. То
же правило, что для плоского rollback на общей сессии. Поэтому по-организационный
commit только под owns_session; на чужой сессии поведение прежнее.

Сбойная организация теперь ещё и откатывается, чтобы её частичные записи не
уезжали в коммит следующей.

Про достижимость: загрузчик живой — 119 строк, 64 системы, последняя загрузка
18.08 (такт недельный, heat-reserves-sync-weekly).

Тесты считают коммиты на сессии-двойнике, то есть проверяют поведение. Против
origin/main:

  на своей сессии 1 коммит при 8 организациях       → падает
  частичные записи сбойной организации не откачены  → падает
  на ЧУЖОЙ сессии промежуточных коммитов нет — контроль, зелёный обе стороны

Контроль не для симметрии: он ловит ровно ту наивную правку, что коммитила бы
чужую транзакцию.

Прогоны: -k "heat or capacity" — 117 passed rc=0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit 9b18c23a5a into main 2026-08-20 11:51:58 +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#2973
No description provided.