3.6 KiB
3.6 KiB
Анализ ошибки ERR_HTTP2_PROTOCOL_ERROR (15.06.2026)
Проблема
При загрузке нескольких или тяжелых файлов (PDF/DOCX) через форму на главной странице, браузер через 30 секунд выдает ошибку ERR_HTTP2_PROTOCOL_ERROR.
Причина
В текущей реализации app.py функция _upload_files выполняет синхронный парсинг каждого файла в цикле:
- Сохранение байтов в БД.
parser_mod.parse(file_bytes, mime)— тяжелая операция (особенно PDF черезpdfplumberили DOC черезlibreoffice).- Формирование текста через
textify. - Обновление БД.
Если суммарное время парсинга всех файлов превышает 30 секунд, K8s Ingress обрывает соединение, не дождавшись HTTP-ответа (Redirect) от Flask.
План действий
- Разделить загрузку и парсинг:
- В
_upload_files(POST /) только сохранять файлы в БД со статусомuploaded. - Сразу делать редирект на страницу договора.
- В
- Перенести парсинг в процесс обработки:
- В
_process(POST /process/) добавить шаг: если документ еще не распарсен (status='uploaded'), сначала вызватьparserиtextify.
- В
- Визуализация:
- Пользователь на странице договора увидит кнопку «Обработать» с таймером. Теперь и парсинг, и LLM будут работать под этим таймером, не блокируя загрузку.
Статус
- Оптимизировать
app.py(убрать парсинг из загрузки). - Обновить
_process(добавить ленивый парсинг). - Добавить таймер на загрузку.
- РЕШЕНО: Перевод обработки в Background Thread (threading) для обхода таймаутов Ingress.
- ФИКС ZIP: Добавлена логика обхода вложенных файлов в
_run_processing_task(раньше ZIP возвращал пустой текст).
План "Асинхронное спасение" (15.06.2026 16:00)
- Threading: В
app.pyзапуск обработки в фоновом потоке, чтобы сразу вернуть ответ 200 OK. - Polling: Фронтенд опрашивает статус обработки.
- No More POST: Замена классической формы на
fetch(), чтобы убрать окно "Подтвердите отправку" при F5.
Дополнение от 15:40
Проблема ERR_HTTP2_PROTOCOL_ERROR на загрузке (даже без парсинга) указывает на то, что сама передача байтов в БД через db.execute для нескольких файлов занимает более 30 секунд.
Решение:
- Визуальный таймер поможет понять реальное время «зависания».
- Если ошибка повторится — это жесткий лимит Ingress на размер тела запроса (Client Max Body Size) или таймаут записи в сетевую БД.