Вечная загрузка #47

Closed
opened 2026-09-09 21:00:12 +03:00 by NotBigGhost · 2 comments
Owner

После запуска полного дева сайт уходит в вечную загрузку, в логах ничего необычного.

После запуска полного дева сайт уходит в вечную загрузку, в логах ничего необычного.
NotBigGhost added this to the v1.35 - промежуточная полировка версии 1.3 milestone 2026-09-09 21:00:12 +03:00
NotBigGhost added the Kind/Bug
Priority
Critical
1
labels 2026-09-09 21:00:12 +03:00
Agent self-assigned this 2026-09-13 11:56:39 +03:00
Agent added the
Reviewed
Confirmed
1
label 2026-09-13 11:56:40 +03:00
Collaborator

План выполнения

Причина (воспроизведена): вкладка держит SSE-соединение /api/events. При любой правке .py (pull, switch, merge) uvicorn --reload останавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений. --timeout-graceful-shutdown по умолчанию не задан, поэтому ожидание длится вечно. Слушающий сокет остаётся у reloader'а: соединения принимаются, но не обслуживаются, и /api/users/me висит, а на экране вечный спиннер. В логе только Reloading.... Сервер оживает ровно в момент, когда закрывается SSE.

  1. run.ps1 и run.sh: запускать uvicorn с --timeout-graceful-shutdown 2 (с комментарием, зачем).
  2. backend/entrypoint.sh (test/prod): --timeout-graceful-shutdown 10. Тот же механизм сейчас держит остановку контейнера до SIGKILL по stop_grace_period: 30s.
  3. README.md и CLAUDE.md: флаг в ручных командах запуска плюс пометка у описания SSE.
  4. Код приложения не меняется: EventSource на клиенте переподключается сам.

Критерии готовности

  • При открытом /api/events правка .py перезапускает бэкенд, и /api/health отвечает 200 за несколько секунд.
  • run.ps1 остаётся ASCII и парсится PowerShell 5.1; run.sh и entrypoint.sh проходят bash -n.
  • pytest зелёный.

Ветка: issue-47-endless-loading от dev

## План выполнения **Причина (воспроизведена):** вкладка держит SSE-соединение `/api/events`. При любой правке `.py` (pull, switch, merge) `uvicorn --reload` останавливает старый процесс, а тот в graceful shutdown ждёт закрытия всех соединений. `--timeout-graceful-shutdown` по умолчанию не задан, поэтому ожидание длится вечно. Слушающий сокет остаётся у reloader'а: соединения принимаются, но не обслуживаются, и `/api/users/me` висит, а на экране вечный спиннер. В логе только `Reloading...`. Сервер оживает ровно в момент, когда закрывается SSE. 1. `run.ps1` и `run.sh`: запускать uvicorn с `--timeout-graceful-shutdown 2` (с комментарием, зачем). 2. `backend/entrypoint.sh` (test/prod): `--timeout-graceful-shutdown 10`. Тот же механизм сейчас держит остановку контейнера до SIGKILL по `stop_grace_period: 30s`. 3. `README.md` и `CLAUDE.md`: флаг в ручных командах запуска плюс пометка у описания SSE. 4. Код приложения не меняется: EventSource на клиенте переподключается сам. **Критерии готовности** - При открытом `/api/events` правка `.py` перезапускает бэкенд, и `/api/health` отвечает 200 за несколько секунд. - `run.ps1` остаётся ASCII и парсится PowerShell 5.1; `run.sh` и `entrypoint.sh` проходят `bash -n`. - `pytest` зелёный. **Ветка:** `issue-47-endless-loading` от `dev`
Agent added the
Status
In Review
label 2026-09-13 12:19:14 +03:00
Collaborator

Работа выполнена, открыт PR: #48

Итог: вечная загрузка возникала, когда uvicorn --reload перезапускался при открытой вкладке: старый процесс бесконечно ждал закрытия SSE-потока /api/events. Теперь uvicorn запускается с --timeout-graceful-shutdown (2 с в dev, 10 с в контейнере), и перезапуск завершается сам.
Проверки: воспроизведение до/после (после правки .py при открытом SSE бэкенд отвечает 200 через ~4 с вместо бесконечного ожидания); run.ps1 — ASCII и парсится PS 5.1; bash -n для run.sh и entrypoint.sh; pytest — 95 passed. entrypoint.sh в Docker вживую не проверялся.
Смежная находка: #49 — через vite-прокси обрыв SSE не доходит до клиента, и после перезапуска бэкенда вкладка молча перестаёт получать события.
Статус: Status/In Review
Осталось за вами: ревью и мёрж PR — задача закроется автоматически.

Работа выполнена, открыт PR: https://gitea.arseniev.info/NotBigGhost/ForbiddenStarsApp/pulls/48 **Итог:** вечная загрузка возникала, когда `uvicorn --reload` перезапускался при открытой вкладке: старый процесс бесконечно ждал закрытия SSE-потока `/api/events`. Теперь uvicorn запускается с `--timeout-graceful-shutdown` (2 с в dev, 10 с в контейнере), и перезапуск завершается сам. **Проверки:** воспроизведение до/после (после правки `.py` при открытом SSE бэкенд отвечает 200 через ~4 с вместо бесконечного ожидания); `run.ps1` — ASCII и парсится PS 5.1; `bash -n` для `run.sh` и `entrypoint.sh`; `pytest` — 95 passed. `entrypoint.sh` в Docker вживую не проверялся. **Смежная находка:** #49 — через vite-прокси обрыв SSE не доходит до клиента, и после перезапуска бэкенда вкладка молча перестаёт получать события. **Статус:** `Status/In Review` **Осталось за вами:** ревью и мёрж PR — задача закроется автоматически.
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#47