# 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 с правильными портами ✅