doc: sqs-operator v0.1.7-v0.1.12 — UI fixes, errors, thinking log 2026-04-08
This commit is contained in:
@@ -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.
|
||||
|
||||
+47
-1
@@ -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
|
||||
|
||||
### Этапы дня
|
||||
|
||||
@@ -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 с правильными портами ✅
|
||||
Reference in New Issue
Block a user