[ekburg_permits] parse_xlsx не закрывает read_only workbook (wb.close()) — утечка дескриптора/буфера #1646

Closed
opened 2026-06-16 18:46:51 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: resource-leak · Файл: backend/app/services/scrapers/ekburg_permits.py:377-397

Файл: backend/app/services/scrapers/ekburg_permits.py:377 (метод parse_xlsx, стр. 371-397). load_workbook(..., read_only=True, data_only=True) открывает воркбук, но wb.close() не вызывается. parse_xlsx — генератор (yield from на стр. 397), воркбук живёт всё время итерации и не освобождается детерминированно. В read_only режиме openpyxl держит ZIP/буферный хэндл, требующий явного close(). Контраст: cbr_macro.parse_inflation_xlsx (стр. 384-395) делает try/finally: wb.close(). Импакт: медленная утечка дескрипторов/буферов при ежемесячном refresh_all на нескольких файлах; не критично. Фикс: обернуть тело генератора в try/finally с wb.close(), либо собрать строки через contextlib.closing(wb) перед yield.

Почему баг: Поскольку parse_xlsx — генератор (yield from), воркбук живёт всё время итерации и не закрывается детерминированно по завершении. При ежемесячном refresh_all на 5 файлов это медленная утечка (read-only буферы/хэндлы), не критично, но это реальный недосмотр в устойчивости парсера.

Как чинить: Обернуть тело в try/finally с wb.close(), либо собрать строки и закрыть до выхода из генератора (учесть, что read_only iter_rows ленивый — close после полной итерации).


deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.85 · unit B33

**Severity:** low · **Категория:** resource-leak · **Файл:** `backend/app/services/scrapers/ekburg_permits.py:377-397` Файл: backend/app/services/scrapers/ekburg_permits.py:377 (метод parse_xlsx, стр. 371-397). load_workbook(..., read_only=True, data_only=True) открывает воркбук, но wb.close() не вызывается. parse_xlsx — генератор (yield from на стр. 397), воркбук живёт всё время итерации и не освобождается детерминированно. В read_only режиме openpyxl держит ZIP/буферный хэндл, требующий явного close(). Контраст: cbr_macro.parse_inflation_xlsx (стр. 384-395) делает try/finally: wb.close(). Импакт: медленная утечка дескрипторов/буферов при ежемесячном refresh_all на нескольких файлах; не критично. Фикс: обернуть тело генератора в try/finally с wb.close(), либо собрать строки через contextlib.closing(wb) перед yield. **Почему баг:** Поскольку parse_xlsx — генератор (yield from), воркбук живёт всё время итерации и не закрывается детерминированно по завершении. При ежемесячном refresh_all на 5 файлов это медленная утечка (read-only буферы/хэндлы), не критично, но это реальный недосмотр в устойчивости парсера. **Как чинить:** Обернуть тело в try/finally с wb.close(), либо собрать строки и закрыть до выхода из генератора (учесть, что read_only iter_rows ленивый — close после полной итерации). --- <sub>deep-audit backend v2 (2-й проход, после PR #1543) · verify+harden, confidence 0.85 · unit B33</sub>
bot-backend added the
week ревью 1
label 2026-06-16 18:46:51 +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#1646
No description provided.