doc: Go runtime v0.1.1, баги 4+5, решения pgx/v5 + dynamic timeout
- progress.md: секция v0.1.1 → ✅ ЗАВЕРШЕНО, все задачи, таблица таймаутов, арх. функции
- errors/log.md: Баг 4 (invoke.go 30s хардкод → context deadline exceeded) + Баг 5 (nginx ingress отсутствие proxy-read-timeout → 504)
- decisions/log.md: pgx/v5 vs database/sql+lib/pq (с обоснованием), динамический таймаут (почему +5s, почему не кешировать, деградация)
This commit is contained in:
+39
-18
@@ -1,45 +1,66 @@
|
||||
# Прогресс разработки
|
||||
|
||||
Последнее обновление: 2026-03-19 21:00
|
||||
Последнее обновление: 2026-03-19 22:30
|
||||
|
||||
---
|
||||
|
||||
## 2026-03-19 — Go runtime v0.1.1: pgx/v5 + stress-go-pgstorm ⏳ В РАБОТЕ
|
||||
## 2026-03-19 — Go runtime v0.1.1: pgx/v5 + stress-go-pgstorm ✅ ЗАВЕРШЕНО
|
||||
|
||||
### Цель
|
||||
Новая функция `stress-go-pgstorm` — Go код со 100 горутинами, которые ~10 минут долбят
|
||||
PostgreSQL напрямую через `pgxpool`. Проверяем: Go runtime под нагрузкой, connection pool
|
||||
под конкурентными запросами, устойчивость кластера.
|
||||
Новая функция `stress-go-pgstorm` — Go код со 100 горутинами, которые 10 минут
|
||||
долбят PostgreSQL напрямую через `pgxpool`. Проверяем: Go runtime под нагрузкой,
|
||||
connection pool под конкурентными запросами, устойчивость кластера.
|
||||
|
||||
**Попутно выявлены и исправлены два системных бага:**
|
||||
- Хардкодный таймаут 30s в invoke.go (прокси оператора)
|
||||
- Отсутствие proxy-read-timeout на nginx ingress sless-operator
|
||||
|
||||
### Задачи
|
||||
|
||||
| # | Задача | Статус | Заметки |
|
||||
|---|--------|--------|---------|
|
||||
| 1 | `runtimes/go1.23/go.mod` — добавить `pgx/v5 v5.7.2` | ✅ | go mod tidy на remote, go.sum сгенерирован (28 строк) |
|
||||
| 2 | `runtimes/go1.23/go.sum` — создан | ✅ | Все indirect deps: pgpassfile, pgservicefile, puddle/v2, crypto, sync, text |
|
||||
| 3 | `runtimes/go1.23/Dockerfile` — добавить `go mod download` | ⏳ | |
|
||||
| 4 | Собрать `naeel/sless-runtime-go1.23:v0.1.1`, запушить | ⏳ | |
|
||||
| 5 | `internal/builder/context.go` — обновить тег `go1.23` → v0.1.1 | ⏳ | |
|
||||
| 6 | Пересобрать оператор `v0.1.39`, задеплоить | ⏳ | |
|
||||
| 7 | `code/stress-go-pgstorm/handler.go` — горутины + pgxpool | ⏳ | |
|
||||
| 8 | `resources.tf` — новая функция + trigger | ⏳ | |
|
||||
| 9 | `terraform apply`, тест | ⏳ | |
|
||||
| 10 | Коммит | ⏳ | |
|
||||
| 2 | `runtimes/go1.23/Dockerfile` — `go mod download` кешируем deps | ✅ | Один stage `golang:1.23-alpine`, COPY go.mod+go.sum перед server.go |
|
||||
| 3 | Собрать `naeel/sless-runtime-go1.23:v0.1.1`, запушить | ✅ | docker build + push, sha256 verified |
|
||||
| 4 | `internal/builder/context.go` — тег `go1.23` v0.1.0 → v0.1.1 | ✅ | строка `return "naeel/sless-runtime-go1.23:v0.1.1", nil` |
|
||||
| 5 | `internal/api/handler/invoke.go` — динамический таймаут | ✅ | Таймаут = Function.Spec.TimeoutSec + 5s (был хардкод 30s) |
|
||||
| 6 | Пересобрать и задеплоить оператор `v0.1.40` | ✅ | rodlout complete |
|
||||
| 7 | `deployments/k8s/operator.yaml` — nginx proxy-read-timeout=900s | ✅ | kubectl annotate + манифест обновлён |
|
||||
| 8 | `code/stress-go-pgstorm/handler.go` — горутины + pgxpool | ✅ | 100 горутин, INSERT/COUNT/MAX, параметры workers/duration_sec/max_delay_ms |
|
||||
| 9 | `resources.tf` — новая функция + trigger | ✅ | timeout_sec=700, memory_mb=256, все PG env vars |
|
||||
| 10 | terraform apply — 2 ресурса добавлено | ✅ | apply complete: 2 added |
|
||||
| 11 | Запуск 10-минутного стресс-теста | ⏳ | Идёт прямо сейчас: workers=100, duration_sec=600, max_delay_ms=300 |
|
||||
| 12 | Коммит d7fda15 | ✅ | feat: Go runtime v0.1.1 (pgx/v5)... |
|
||||
|
||||
### Архитектура функции stress-go-pgstorm
|
||||
|
||||
```
|
||||
Handle(event) → запускает N горутин (default 100)
|
||||
каждая горутина в цикле duration_sec (default 600):
|
||||
- случайная задержка 0-500ms
|
||||
- случайная задержка 0-300ms (max_delay_ms)
|
||||
- чередующиеся операции: INSERT / SELECT COUNT / SELECT MAX
|
||||
- логирует ошибки, считает ok/err
|
||||
финал → {workers, duration_sec, total_ops, ok_ops, err_ops, ops_per_sec}
|
||||
- считает ok/err атомарно через sync/atomic
|
||||
WaitGroup.Wait() → возвращает итог
|
||||
возвращает: {runtime, version, workers, duration_sec, elapsed_sec,
|
||||
total_ops, ok_ops, err_ops, ops_per_sec}
|
||||
|
||||
pgxpool.New() — connection pool, MaxConns=20
|
||||
env: PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD, PGSSLMODE
|
||||
```
|
||||
|
||||
---
|
||||
### Цепочка таймаутов (после фиксов)
|
||||
|
||||
| Слой | Таймаут | Где задаётся |
|
||||
|------|---------|--------------|
|
||||
| curl --max-time | 720s | клиент |
|
||||
| nginx ingress proxy-read-timeout | 900s | аннотация ingress sless-operator |
|
||||
| operator http.Client (invoke.go) | TimeoutSec+5s = 705s | Function.Spec.TimeoutSec=700 |
|
||||
| function runtime (Go) | duration_sec = 600s | параметр в JSON body |
|
||||
|
||||
### Что было сломано до этой сессии
|
||||
|
||||
1. invoke.go: `var httpClient = &http.Client{Timeout: 30 * time.Second}` — хардкод в строке 24
|
||||
2. nginx ingress sless-operator: аннотации proxy-read-timeout не было → nginx дефолт 60s → 504
|
||||
|
||||
## 2026-03-19 — Tests 3-7: E2E прогон POSTGRES + 8 стресс-функций
|
||||
|
||||
|
||||
Reference in New Issue
Block a user