fix(backend): reservation_ingest пейсинг + короткоживущая DB-сессия (#2445-D4) #2458

Merged
bot-backend merged 1 commit from fix/reservation-pacing-session into main 2026-07-05 20:09:01 +00:00
Collaborator

Summary

Аудит-находка D4 (epic #2445, WAF-гигиена #2443). reservation_ingest.py держал SQLAlchemy-сессию открытой через каждый внешний PDF-fetch в циклах (connection-pool risk), а pravo_gov66_client.py не имел пейсинга/backoff (тот же risk shape, что WAF-бан ДОМ.РФ).

Fix

  • DB-запись перенесена в короткоживущую per-document SessionLocal(), открываемую только вокруг upsert. Внешние fetch'и (get_document_pdf_url/fetch_pdf) теперь без открытой сессии.
  • _get_with_backoff в pravo-клиенте: time.sleep(0.4) пейсинг перед каждым запросом + 429/5xx экспоненциальный backoff (по образцу gisogd66._get_json).
  • Транзакционная гранулярность (per-document commit + per-row SAVEPOINT + idempotent UPSERT) сохранена дословно; exception-path строже (явный rollback перед close).

Test plan

  • 36 тестов зелёные (session закрыта после каждого doc, не открыта при 0 records, пейсинг, 429-backoff, 404-no-retry)
  • ruff чисто, psycopg CAST соблюдён
  • code-reviewer: APPROVE (транзакционная семантика — главный риск — идентична старой, поведение-сохраняюще)

Refs #2445

## Summary Аудит-находка D4 (epic #2445, WAF-гигиена #2443). `reservation_ingest.py` держал SQLAlchemy-сессию открытой через каждый внешний PDF-fetch в циклах (connection-pool risk), а `pravo_gov66_client.py` не имел пейсинга/backoff (тот же risk shape, что WAF-бан ДОМ.РФ). ## Fix - DB-запись перенесена в короткоживущую **per-document** `SessionLocal()`, открываемую только вокруг upsert. Внешние fetch'и (`get_document_pdf_url`/`fetch_pdf`) теперь без открытой сессии. - `_get_with_backoff` в pravo-клиенте: `time.sleep(0.4)` пейсинг перед каждым запросом + 429/5xx экспоненциальный backoff (по образцу `gisogd66._get_json`). - Транзакционная гранулярность (per-document commit + per-row SAVEPOINT + idempotent UPSERT) сохранена дословно; exception-path строже (явный rollback перед close). ## Test plan - [x] 36 тестов зелёные (session закрыта после каждого doc, не открыта при 0 records, пейсинг, 429-backoff, 404-no-retry) - [x] ruff чисто, psycopg `CAST` соблюдён - [x] code-reviewer: ✅ APPROVE (транзакционная семантика — главный риск — идентична старой, поведение-сохраняюще) Refs #2445
bot-backend added 1 commit 2026-07-05 19:44:05 +00:00
fix(backend): пейсинг pravo.gov66.ru + не держать DB-сессию через PDF-fetch (#2445-D4)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 9s
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 3m0s
CI / backend-tests (pull_request) Successful in 15m28s
a77b353b06
reservation_ingest держал SQLAlchemy-сессию открытой через каждый PDF-fetch в
enumerate/explicit циклах, а pravo_gov66_client не имел пейсинга/backoff — тот же
risk shape, что WAF-бан ДОМ.РФ (#2443). DB-запись перенесена в короткоживущую
per-document сессию, открываемую только вокруг upsert; добавлен sleep-пейсинг
(0.4с) + 429/5xx backoff в pravo.gov66-клиент (по образцу gisogd66._get_json).
Транзакционная гранулярность (per-document commit + per-row SAVEPOINT) сохранена.

Refs #2445
bot-backend merged commit d1fa450f48 into main 2026-07-05 20:09:01 +00:00
bot-backend deleted branch fix/reservation-pacing-session 2026-07-05 20:09:01 +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#2458
No description provided.