fix: rewrite seed job to avoid PL/pgSQL $$ blocks #183

Merged
claude merged 1 commits from fix/seed-job-v2 into main 2026-02-20 00:05:06 +01:00
Owner
No description provided.
claude added 1 commit 2026-02-20 00:04:17 +01:00
fix: rewrite seed job to avoid PL/pgSQL $$ blocks
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 1s
PR Checks / Validate & Security Scan (pull_request) Successful in 9s
56d395864b
The $$ dollar-quoting in PL/pgSQL DO blocks gets expanded by bash
when passed via Kubernetes args to bash -c. Rewrites seed to use
individual psql -c calls and shell loop for batch inserts.

Also adds CREATE TABLE IF NOT EXISTS and idempotency check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

AI Code Review

Обзор PR: Переписка seed job без PL/pgSQL блоков

Общее впечатление: PR в порядке, ничего критичного.

Хорошо

  • Bash вместо PL/pgSQL — избегаешь $$ блоков, упрощаешь отладку и логирование
  • set -e — скрипт падает при первой ошибке
  • Job name версионирование (report-generator-seed-v2) — предотвращает конфликты переименования
  • SecurityContext сохранён (allowPrivilegeEscalation: false)
  • Resources обновлены разумно (256Mi request, 1 CPU limit)
  • Изоляция namespace (dev/staging/prod) — хорошо

⚠️ Проблемы

  1. Отсутствует backoffLimit и restartPolicy
    Job может зависнуть или перезапуститься неконтролируемо. Добавь:

    spec:
      backoffLimit: 3
      template:
        spec:
          restartPolicy: Never  # или OnFailure
    
  2. Уязвимость TOCTOU при проверке seeded
    Проверка COUNT=$(psql... SELECT COUNT(*) FROM orders) в отдельной команде может дать race condition, если несколько Job запустятся параллельно.
    Решение: добавь parallelism: 1 в Job spec или используй транзакцию с LOCK:

    spec:
      parallelism: 1
      completions: 1
    
  3. Нет timeout на скрипт
    Seeding 5M строк может занять часы. Добавь activeDeadlineSeconds:

    spec:
      activeDeadlineSeconds: 14400  # 4 часа
    
  4. Логирование одного batch-а
    echo "Batch $BATCH/50..." выведется только после всей вставки (100k строк). При зависании — не будешь видеть, где stuck. Добавь прогресс внутри psql или переведи на пулы меньше.

  5. Отсутствует liveness/readiness для Job
    Это однократный Job, но если перейдёшь на CronJob — нужны будут.

Minimal fix:

spec:
  backoffLimit: 3
  parallelism: 1
  completions: 1
  activeDeadlineSeconds: 14400
  ttlSecondsAfterFinished: 3600
  template:
    spec:
      restartPolicy: Never
      # ... контейнер ...

Итог: Логика скрипта хорошая, но надо добавить 4 строки в spec для надёжности.


Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review ## Обзор PR: Переписка seed job без PL/pgSQL блоков **Общее впечатление:** PR в порядке, ничего критичного. ### ✅ Хорошо - **Bash вместо PL/pgSQL** — избегаешь $$ блоков, упрощаешь отладку и логирование - **`set -e`** — скрипт падает при первой ошибке - **Job name версионирование** (`report-generator-seed-v2`) — предотвращает конфликты переименования - **SecurityContext** сохранён (allowPrivilegeEscalation: false) - **Resources обновлены** разумно (256Mi request, 1 CPU limit) - **Изоляция namespace** (dev/staging/prod) — хорошо ### ⚠️ Проблемы 1. **Отсутствует `backoffLimit` и `restartPolicy`** Job может зависнуть или перезапуститься неконтролируемо. Добавь: ```yaml spec: backoffLimit: 3 template: spec: restartPolicy: Never # или OnFailure ``` 2. **Уязвимость TOCTOU при проверке seeded** Проверка `COUNT=$(psql... SELECT COUNT(*) FROM orders)` в отдельной команде может дать race condition, если несколько Job запустятся параллельно. **Решение:** добавь `parallelism: 1` в Job spec или используй транзакцию с LOCK: ```yaml spec: parallelism: 1 completions: 1 ``` 3. **Нет timeout на скрипт** Seeding 5M строк может занять часы. Добавь `activeDeadlineSeconds`: ```yaml spec: activeDeadlineSeconds: 14400 # 4 часа ``` 4. **Логирование одного batch-а** `echo "Batch $BATCH/50..."` выведется только после всей вставки (100k строк). При зависании — не будешь видеть, где stuck. Добавь прогресс внутри psql или переведи на пулы меньше. 5. **Отсутствует liveness/readiness для Job** Это однократный Job, но если перейдёшь на CronJob — нужны будут. ### Minimal fix: ```yaml spec: backoffLimit: 3 parallelism: 1 completions: 1 activeDeadlineSeconds: 14400 ttlSecondsAfterFinished: 3600 template: spec: restartPolicy: Never # ... контейнер ... ``` **Итог:** Логика скрипта хорошая, но надо добавить 4 строки в spec для надёжности. --- _Automated review by Claude Haiku | advisory, does not block merge_
claude merged commit a2c340899a into main 2026-02-20 00:05:06 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: claude/k8s-apps#183
No description provided.