fix: бесконечный цикл сборки — idempotency guard через last-built-s3key аннотацию

Проблема: upload handler сбрасывал phase в Pending ПОСЛЕ того как
контроллер уже выставил Building → бесконечный цикл (94 job'а).

Решение:
- controllers/function_controller.go: startBuild сначала ставит аннотацию
  last-built-s3key = spec.S3Key (idempotency guard), потом status.
  Reconcile стартует сборку только если spec.S3Key != last-built-s3key.
- handler/upload.go: убран Status().Update() — контроллер сам управляет фазой.
- builder.go: IsAlreadyExists при создании job не ошибка (parallel reconcile).
This commit is contained in:
“Naeel”
2026-03-07 09:50:24 +04:00
parent 8bae4ca69c
commit 4115e0f172
3 changed files with 27 additions and 25 deletions
+5
View File
@@ -121,6 +121,11 @@ func (b *Builder) Build(ctx context.Context, namespace, funcName, s3Key string)
}
if err := b.client.Create(ctx, job); err != nil {
// Если job с таким именем уже существует (два reconcile в одну секунду) —
// возвращаем имя, контроллер будет следить за ним как обычно
if errors.IsAlreadyExists(err) {
return jobName, nil
}
return "", fmt.Errorf("create build job: %w", err)
}
return jobName, nil