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