From 3f4e27d48114d4d6b9f0efdb8c92d81480e8e084 Mon Sep 17 00:00:00 2001 From: dayeguilaiye <979014041@qq.com> Date: Wed, 2 Oct 2024 18:33:51 +0800 Subject: [PATCH] fix(helm): No more retry if jobs failed beyond BackoffLimit Signed-off-by: dayeguilaiye <979014041@qq.com> --- pkg/kube/ready.go | 4 ++-- pkg/kube/wait.go | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/kube/ready.go b/pkg/kube/ready.go index 55c4a39bf..3e7b77f7d 100644 --- a/pkg/kube/ready.go +++ b/pkg/kube/ready.go @@ -18,7 +18,7 @@ package kube // import "helm.sh/helm/v3/pkg/kube" import ( "context" - "fmt" + "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" @@ -241,7 +241,7 @@ func (c *ReadyChecker) jobReady(job *batchv1.Job) (bool, error) { if job.Status.Failed > *job.Spec.BackoffLimit { c.log("Job is failed: %s/%s", job.GetNamespace(), job.GetName()) // If a job is failed, it can't recover, so throw an error - return false, fmt.Errorf("job is failed: %s/%s", job.GetNamespace(), job.GetName()) + return false, errors.Wrapf(ErrNoRetryError, "job is failed: %s/%s", job.GetNamespace(), job.GetName()) } if job.Spec.Completions != nil && job.Status.Succeeded < *job.Spec.Completions { c.log("Job is not completed: %s/%s", job.GetNamespace(), job.GetName()) diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 36110d0de..9ce5070d6 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -38,6 +38,8 @@ import ( "k8s.io/apimachinery/pkg/util/wait" ) +var ErrNoRetryError = errors.New("this error will stop retry") + type waiter struct { c ReadyChecker timeout time.Duration @@ -91,6 +93,10 @@ func (w *waiter) isRetryableError(err error, resource *resource.Info) bool { w.log("Status code received: %d. Retryable error? %t", statusCode, retryable) return retryable } + if errors.Is(err, ErrNoRetryError) { + w.log("The error is a NoRetryError, Retryable err? %t", false) + return false + } w.log("Retryable error? %t", true) return true }