Skip to content

Commit 315b7eb

Browse files
authored
clm: add retries while applying/deleting in case of ephemeral errors (#187)
1 parent 06b2d2a commit 315b7eb

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

clm/cmd/apply.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package cmd
88
import (
99
"context"
1010
"fmt"
11+
"os"
1112
"time"
1213

1314
"github.com/spf13/cobra"
@@ -111,18 +112,27 @@ func newApplyCmd() *cobra.Command {
111112
}
112113
}()
113114

115+
const maxErrCount = 15
116+
errCount := 0
117+
114118
for {
115119
release.State = component.StateProcessing
116120
ok, err := reconciler.Apply(context.TODO(), &release.Inventory, objects, namespace, ownerId, release.Revision)
117121
if err != nil {
118-
return err
119-
}
120-
if ok {
121-
release.State = component.StateReady
122-
break
123-
}
124-
if err := releaseClient.Update(context.TODO(), release); err != nil {
125-
return err
122+
if !isEphmeralError(err) || errCount >= maxErrCount {
123+
return err
124+
}
125+
errCount++
126+
fmt.Fprintf(os.Stderr, "Error: %s (retrying %d/%d)\n", err, errCount, maxErrCount)
127+
} else {
128+
errCount = 0
129+
if ok {
130+
release.State = component.StateReady
131+
break
132+
}
133+
if err := releaseClient.Update(context.TODO(), release); err != nil {
134+
return err
135+
}
126136
}
127137
select {
128138
case <-time.After(backoff.Next()):

clm/cmd/delete.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package cmd
88
import (
99
"context"
1010
"fmt"
11+
"os"
1112
"time"
1213

1314
"github.com/spf13/cobra"
@@ -88,17 +89,26 @@ func newDeleteCmd() *cobra.Command {
8889
}
8990
}()
9091

92+
const maxErrCount = 15
93+
errCount := 0
94+
9195
for {
9296
release.State = component.StateDeleting
9397
ok, err := reconciler.Delete(context.TODO(), &release.Inventory)
9498
if err != nil {
95-
return err
96-
}
97-
if ok {
98-
break
99-
}
100-
if err := releaseClient.Update(context.TODO(), release); err != nil {
101-
return err
99+
if !isEphmeralError(err) || errCount >= maxErrCount {
100+
return err
101+
}
102+
errCount++
103+
fmt.Fprintf(os.Stderr, "Error: %s (retrying %d/%d)\n", err, errCount, maxErrCount)
104+
} else {
105+
errCount = 0
106+
if ok {
107+
break
108+
}
109+
if err := releaseClient.Update(context.TODO(), release); err != nil {
110+
return err
111+
}
102112
}
103113
select {
104114
case <-time.After(backoff.Next()):

clm/cmd/util.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212

1313
"github.com/sap/go-generics/slices"
1414
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
15+
apierrors "k8s.io/apimachinery/pkg/api/errors"
1516
"k8s.io/apimachinery/pkg/runtime"
1617
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1718
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
@@ -58,6 +59,13 @@ func getClient(kubeConfigPath string) (cluster.Client, error) {
5859
return cluster.NewClientFor(config, scheme, fullName)
5960
}
6061

62+
func isEphmeralError(err error) bool {
63+
if apierrors.IsConflict(err) {
64+
return true
65+
}
66+
return false
67+
}
68+
6169
func formatTimestamp(t time.Time) string {
6270
d := time.Now().Sub(t)
6371
if d > 24*time.Hour {

0 commit comments

Comments
 (0)