Files
sless/doc/thinking/2026-04-08.md
T

5.2 KiB
Raw Blame History

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:

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.goGenerateConfig() → 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 с правильными портами