doc: sqs-operator v0.1.7-v0.1.12 — UI fixes, errors, thinking log 2026-04-08

This commit is contained in:
Naeel
2026-04-09 06:25:38 +03:00
parent 3adc0d8323
commit 6b7b60db1b
3 changed files with 200 additions and 1 deletions
+44
View File
@@ -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.7v0.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.
+47 -1
View File
@@ -1,9 +1,55 @@
# Прогресс разработки
Последнее обновление: 2026-04-07 21:30 МСК
Последнее обновление: 2026-04-09 МСК
---
## 2026-04-08/09 — SQS Operator v0.1.7v0.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.0v0.1.6: разработка, деплой, тестирование, tuning
### Этапы дня
+109
View File
@@ -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.8v0.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 с правильными портами ✅