diff --git a/doc/errors/log.md b/doc/errors/log.md index a293571..b9a77b6 100644 --- a/doc/errors/log.md +++ b/doc/errors/log.md @@ -1618,3 +1618,47 @@ if errors.IsInvalid(err) { **Симптом:** После `kubectl delete pod` оператора API возвращает 503 (не 400/404/409) **Причина:** Operator pod = API server. Пока старый pod завершается и новый не поднялся — ingress/proxy отдаёт 503 **Исправление:** Тест принимает 503/502 как валидный транзиентный ответ с NOTE + +--- + +## 2026-04-08/09 — SQS Operator UI (v0.1.7–v0.1.12) + +### ERR-SQS-01: UI зависает на загрузке (shimmer) + +**Симптом:** https://sqs.kube5s.ru/sqs-ui/test001/ — страница грузится (HTTP 200), но список очередей не появляется, крутится shimmer. +**Причина:** После стресс-теста с `autoCreateQueues=true` ElasticMQ накопил 4912 очередей `no-such-queue-*`. UI грузил все → зависал. +**Решение:** Удалить H2 базу (`rm /data/elasticmq.mv.db`) + kubectl rollout restart. +**Профилактика:** В стресс-тесте error-injection паттерн создаёт запросы к несуществующим очередям — при `autoCreateQueues=true` они все создаются. Чистить базу после стресс-теста. + +--- + +### ERR-SQS-02: 503 после kubectl rollout restart (self-healing) + +**Симптом:** После SH02/SH05 (удаление Service) UI возвращает 503. +**Причина:** `ensureService` создавал сервис только с портом 9324. При пересоздании порт 3000 (UI) не добавлялся. +**Решение (v0.1.11):** `ensureService` проверяет `qs.Spec.EnableUI` и добавляет порт 3000 при необходимости. + +--- + +### ERR-SQS-03: SendMessage зависает после rollout restart + +**Симптом:** HTTP-запрос `SendMessage` не возвращается, висит. +**Причина:** При `kubectl rollout restart` JVM убивается принудительно. H2 database lock (`elasticmq.mv.db`) не снимается. При следующем старте ElasticMQ actor застревает на восстановлении. +**Решение (v0.1.10):** Добавить `FILE_LOCK=NO` в JDBC URL в HOCON конфиге. H2 игнорирует stale lock. + +--- + +### ERR-SQS-04: queueservice_controller.go обнулён (0 байт) + +**Симптом:** `wc -l queueservice_controller.go` → 0. Go build падает с "no Go files". +**Причина:** Диск был 100% заполнен (54GB docker images). sshfs при записи через VS Code cursor создал пустой файл вместо ошибки. +**Решение:** `git checkout HEAD -- internal/controller/queueservice_controller.go` + повторное применение патчей v0.1.11. +**Профилактика:** `docker system prune -af` регулярно. Проверять `df -h` перед крупными операциями. + +--- + +### ERR-SQS-05: 404 на /queues/xxx при навигации в UI + +**Симптом:** Клик на очередь в UI → браузер переходит на `/queues/1234` → nginx 404. +**Причина:** Next.js в образе `elasticmq-ui` собран с `basePath=""`. Внутренние переходы идут по абсолютным путям без prefix `/sqs-ui/tenantID/`. Ingress не знал о маршруте `/queues`. +**Решение (v0.1.12):** `ensureIngressUIQueues` — третий ingress `/queues` PathTypePrefix → UI service:3000. Без rewrite-target. diff --git a/doc/progress.md b/doc/progress.md index 330bab1..fef7403 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -1,9 +1,55 @@ # Прогресс разработки -Последнее обновление: 2026-04-07 21:30 МСК +Последнее обновление: 2026-04-09 МСК --- +## 2026-04-08/09 — SQS Operator v0.1.7–v0.1.12: Web UI + стабилизация + +### Этапы + +| Версия | Что сделано | Коммит | +|--------|------------|--------| +| v0.1.7 | enableUI, autoCreateQueues, фикс A06 long polling | 6462665 | +| v0.1.8 | Ingress /_next/ для статики Next.js (blank page fix) | 657fc33 | +| v0.1.9 | SQS_ENDPOINT с context-path (Connection Error fix) | 7ea7e9b | +| v0.1.10 | FILE_LOCK=NO в H2 JDBC URL (SendMessage зависал после rollout restart) | — | +| v0.1.11 | ensureService добавляет port 3000 при enableUI=true (503 после self-healing) | a04d720 | +| v0.1.12 | Ingress /queues -> elasticmq-ui:3000 (404 при навигации) | 3adc0d8 | + +### Тест-сьют v0.1.10 — финал + +- **44 PASS / 2 FAIL / 4 WARN / 2 SKIP** (52 теста, 35 мин 12 сек) +- Стресс-марафон 30 мин: **12501** итераций, **0** инфра-ошибок, **0** рестартов +- 2 FAIL: E03/E05 — поведение ElasticMQ (autoCreateQueues=true создаёт очередь вместо ошибки) + +### UI маршруты + +- `/sqs-ui/{tenantID}/` → главная (список очередей) +- `/_next/` → статика Next.js +- `/queues/*` → детали очереди (навигация) + +### Инфраструктурные проблемы + +| Проблема | Решение | +|----------|---------| +| Диск 100% (54GB docker images) | docker system prune -af | +| sshfs обнулил файл при 100% диске | git checkout HEAD -- ... | +| H2 lock после принудительной остановки JVM | FILE_LOCK=NO в JDBC URL | +| 4912 мусорных очередей после стресс-теста | Удалить H2 + рестарт пода | + +### Состояние кластера + +| Компонент | Статус | +|-----------|--------| +| sqs-operator | v0.1.12, Running 1/1 | +| test001 pod | 2/2 Running | +| UI | HTTP 200, навигация работает | +| Коммит | 3adc0d8 (ветка sqs-operator) | + +--- + + ## 2026-04-07 — SQS Operator v0.1.0–v0.1.6: разработка, деплой, тестирование, tuning ### Этапы дня diff --git a/doc/thinking/2026-04-08.md b/doc/thinking/2026-04-08.md new file mode 100644 index 0000000..ddca246 --- /dev/null +++ b/doc/thinking/2026-04-08.md @@ -0,0 +1,109 @@ +# Thinking Log — 2026-04-08/09 +# Agent: GitHub Copilot (Claude Sonnet 4.6) + +--- + +## Сессия 2026-04-08 — SQS Operator UI fixes + v0.1.8–v0.1.12 + +### Контекст на старте +- v0.1.9 задеплоен, UI HTTP 200, но визуально зависает (shimmer) +- Стресс-тест (30 мин) только что завершён: 12501 итераций, 0 инфра-ошибок + +--- + +## Расследование "UI зависает" + +**Гипотеза 1:** Socket overflow (как было до v0.1.9) — проверил логи, нет. + +**Факт:** `ListQueues` вернул 4912 очередей `no-such-queue-*`. Причина: стресс-тест с `autoCreateQueues=true` создавал несуществующие очереди (тест error-injection). ElasticMQ при `autoCreateQueues=true` создаёт их все. UI грузил 4912 очередей → зависал. + +**Решение:** Удалить H2 базу данных (rm /data/elasticmq.mv.db), рестарт пода. Очереди обнуляются. + +**Урок:** Стресс-тест с `error-injection` паттерном + `autoCreateQueues=true` = накапливает мусорные очереди. Нужно разделять: либо `autoCreateQueues=false` в стресс-тесте, либо чистить базу после. + +--- + +## Баг "503 после self-healing" + +**Проблема:** После SH02/SH05 (удаление Service) сервис пересоздавался без порта 3000 для UI. + +**Root cause:** `ensureService` всегда создавал только `sqs-http:9324`. Порт UI (`ui-http:3000`) добавлялся только при первичном создании через условную логику, которой не было. + +**Фикс (v0.1.11):** В `ensureService` — func literal для Ports: +```go +Ports: func() []corev1.ServicePort { + ports := []corev1.ServicePort{ {sqs-http} } + if qs.Spec.EnableUI { + ports = append(ports, {ui-http:3000}) + } + return ports +}(), +``` + +--- + +## Баг "диск 100%" + +**Обнаружен:** `git status` вернул `sha1 file write error. Out of diskspace`. + +**Причина:** 201 docker image (53GB), 99% reclaimable — накопились за все версии сборок. + +**Решение:** `docker system prune -af --volumes` — освободило 54GB. + +**Опасность:** При 100% диска sshfs-запись ОБНУЛЯЕТ файл вместо ошибки. `queueservice_controller.go` был обнулён (0 байт). Восстановлен через `git checkout HEAD -- ...`. + +**Урок:** Регулярно чистить docker images. Проверять диск перед крупными операциями. + +--- + +## Баг "404 на /queues/xxx" + +**Проблема:** Next.js app в elasticmq-ui имеет маршруты: +- `/` — список очередей +- `/queues/[name]` — детали очереди + +Ingress знал только `/sqs-ui/test001/` и `/_next/`. При клике на очередь в UI браузер переходил на `/queues/1234` → nginx 404. + +**Root cause:** Next.js собран с `basePath=""` — внутренние переходы идут по абсолютным путям без prefix. + +**Решение (v0.1.12):** Новая функция `ensureIngressUIQueues` — третий ingress `/queues` PathTypePrefix → UI service port 3000. Без rewrite-target (Next.js сам обрабатывает `/queues/[name]`). + +**Добавлено в 3 места контроллера:** +1. Вызов `ensureIngressUIQueues` в reconcile (рядом с `ensureIngressUIAssets`) +2. `checkResources` — self-healing отслеживает `sqs-ing-ui-queues-{tenantID}` +3. `handleDeletion` — очищает ingress при удалении тенанта + +--- + +## H2 база и FILE_LOCK (v0.1.10) + +**Проблема:** После `kubectl rollout restart` JVM убивается принудительно, H2 lock не снимается. При следующем старте: `Failed to restore persisted queues` — SendMessage зависает. + +**Решение:** +1. JDBC URL: добавить `FILE_LOCK=NO` (игнорирует stale lock) +2. При старте H2 уже инициализирована чисто + +**Место:** `elasticmq_config.go` → `GenerateConfig()` → HOCON `persistence.jdbc.url` + +--- + +## Версии и коммиты + +| Версия | Коммит | Описание | +|--------|--------|----------| +| v0.1.8 | 657fc33 | `/_next/` assets ingress | +| v0.1.9 | 7ea7e9b | SQS_ENDPOINT с context-path | +| v0.1.10 | — | FILE_LOCK=NO для H2, не отдельный коммит | +| v0.1.11 | a04d720 | ensureService UI port + FILE_LOCK=NO | +| v0.1.12 | 3adc0d8 | ingress /queues/* → elasticmq-ui | + +--- + +## Итог + +SQS Operator с Web UI полностью функционален: +- `/sqs-ui/test001/` — главная страница UI ✅ +- `/_next/` — статические ресурсы Next.js ✅ +- `/queues/xxx` — навигация по очередям ✅ +- `/sqs/test001` — SQS API ✅ +- Self-healing: все 3 ingress + service с правильными портами ✅