httpx.Response.json() загружает 607 МБ payload в Python list[dict] -> 2-3 ГБ RAM -> host OOM-killer SIGKILL ForkPoolWorker.
Изменения:
- ObjectiveClient._open_stream() / stream_report() — httpx stream=True
- parse_lots_pf_stream() — ijson.items() с batched UPSERT + commit/5 batch
- _save_raw() принимает payload=None для streamed reports
- objective_raw_reports.payload allowed NULL (миграция 79)
- ijson>=3.2.0 добавлен в pyproject.toml, uv.lock обновлён
Glitchtip BACKEND-1H/-1I (release fce48a8) — OOM на live trigger.
14 lines
810 B
PL/PgSQL
14 lines
810 B
PL/PgSQL
-- 79_relax_objective_raw_payload_null.sql
|
||
-- Разрешаем NULL в objective_raw_reports.payload для stream-parsed отчётов.
|
||
-- Поквартирные/Лоты (lots_pf) могут быть 600+ МБ — хранить полный JSONB не имеет
|
||
-- смысла (96 ГБ за полгода × 4 группы × еженедельно). Для таких отчётов пишем
|
||
-- payload = NULL, size и rows_extracted по-прежнему заполняются.
|
||
BEGIN;
|
||
|
||
ALTER TABLE objective_raw_reports ALTER COLUMN payload DROP NOT NULL;
|
||
|
||
COMMENT ON COLUMN objective_raw_reports.payload IS
|
||
'NULL для stream-parsed отчётов (lots_pf 600+ МБ — не храним целиком). '
|
||
'payload_size и rows_extracted всегда заполнены.';
|
||
|
||
COMMIT;
|