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
-8
View File
@@ -175,14 +175,6 @@ func (h *Handler) UploadCode(w http.ResponseWriter, r *http.Request) {
return
}
// Сбрасываем phase в Pending чтобы контроллер начал сборку
fn.Status.Phase = slessv1alpha1.FunctionPhasePending
fn.Status.Message = "code uploaded, build queued"
if err := h.K8s.Status().Update(r.Context(), fn); err != nil {
// Не фатально — контроллер подберёт через reconcile
h.Log.Warn("failed to reset function phase", "name", name, "ns", ns, "err", err)
}
writeJSON(w, http.StatusOK, map[string]string{
"s3_key": s3Key,
"phase": string(slessv1alpha1.FunctionPhasePending),