Skip to content

Commit e5f99cf

Browse files
authored
Merge pull request #174 from arangodb/improvement/allow-early-cluster-inspections-2-fail
Avoid useless warnings in log
2 parents 5e3b732 + 0555a71 commit e5f99cf

File tree

10 files changed

+62
-26
lines changed

10 files changed

+62
-26
lines changed

pkg/deployment/cleanup.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ func (d *Deployment) removePodFinalizers() error {
3535
return maskAny(err)
3636
}
3737
for _, p := range pods {
38-
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
38+
ignoreNotFound := true
39+
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
3940
log.Warn().Err(err).Msg("Failed to remove pod finalizers")
4041
}
4142
}
@@ -51,7 +52,8 @@ func (d *Deployment) removePVCFinalizers() error {
5152
return maskAny(err)
5253
}
5354
for _, p := range pvcs {
54-
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
55+
ignoreNotFound := true
56+
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
5557
log.Warn().Err(err).Msg("Failed to remove PVC finalizers")
5658
}
5759
}

pkg/deployment/cluster_scaling_integration.go

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ type clusterScalingIntegration struct {
5050
}
5151
}
5252

53+
const (
54+
maxClusterBootstrapTime = time.Minute * 2 // Time we allow a cluster bootstrap to take, before we can do cluster inspections.
55+
)
56+
5357
// newClusterScalingIntegration creates a new clusterScalingIntegration.
5458
func newClusterScalingIntegration(depl *Deployment) *clusterScalingIntegration {
5559
return &clusterScalingIntegration{
@@ -67,20 +71,29 @@ func (ci *clusterScalingIntegration) SendUpdateToCluster(spec api.DeploymentSpec
6771

6872
// listenForClusterEvents keep listening for changes entered in the UI of the cluster.
6973
func (ci *clusterScalingIntegration) ListenForClusterEvents(stopCh <-chan struct{}) {
74+
start := time.Now()
75+
goodInspections := 0
7076
for {
7177
delay := time.Second * 2
7278

7379
// Is deployment in running state
7480
if ci.depl.GetPhase() == api.DeploymentPhaseRunning {
7581
// Update cluster with our state
7682
ctx := context.Background()
77-
safeToAskCluster, err := ci.updateClusterServerCount(ctx)
83+
expectSuccess := goodInspections > 0 || time.Since(start) > maxClusterBootstrapTime
84+
safeToAskCluster, err := ci.updateClusterServerCount(ctx, expectSuccess)
7885
if err != nil {
79-
ci.log.Debug().Err(err).Msg("Cluster update failed")
86+
if expectSuccess {
87+
ci.log.Debug().Err(err).Msg("Cluster update failed")
88+
}
8089
} else if safeToAskCluster {
8190
// Inspect once
82-
if err := ci.inspectCluster(ctx); err != nil {
83-
ci.log.Debug().Err(err).Msg("Cluster inspection failed")
91+
if err := ci.inspectCluster(ctx, expectSuccess); err != nil {
92+
if expectSuccess {
93+
ci.log.Debug().Err(err).Msg("Cluster inspection failed")
94+
}
95+
} else {
96+
goodInspections++
8497
}
8598
}
8699
}
@@ -96,15 +109,17 @@ func (ci *clusterScalingIntegration) ListenForClusterEvents(stopCh <-chan struct
96109
}
97110

98111
// Perform a single inspection of the cluster
99-
func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context) error {
112+
func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context, expectSuccess bool) error {
100113
log := ci.log
101114
c, err := ci.depl.clientCache.GetDatabase(ctx)
102115
if err != nil {
103116
return maskAny(err)
104117
}
105118
req, err := arangod.GetNumberOfServers(ctx, c.Connection())
106119
if err != nil {
107-
log.Debug().Err(err).Msg("Failed to get number of servers")
120+
if expectSuccess {
121+
log.Debug().Err(err).Msg("Failed to get number of servers")
122+
}
108123
return maskAny(err)
109124
}
110125
if req.Coordinators == nil && req.DBServers == nil {
@@ -150,7 +165,7 @@ func (ci *clusterScalingIntegration) inspectCluster(ctx context.Context) error {
150165

151166
// updateClusterServerCount updates the intended number of servers of the cluster.
152167
// Returns true when it is safe to ask the cluster for updates.
153-
func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Context) (bool, error) {
168+
func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Context, expectSuccess bool) (bool, error) {
154169
// Any update needed?
155170
ci.pendingUpdate.mutex.Lock()
156171
spec := ci.pendingUpdate.spec
@@ -168,7 +183,9 @@ func (ci *clusterScalingIntegration) updateClusterServerCount(ctx context.Contex
168183
coordinatorCount := spec.Coordinators.GetCount()
169184
dbserverCount := spec.DBServers.GetCount()
170185
if err := arangod.SetNumberOfServers(ctx, c.Connection(), coordinatorCount, dbserverCount); err != nil {
171-
log.Debug().Err(err).Msg("Failed to set number of servers")
186+
if expectSuccess {
187+
log.Debug().Err(err).Msg("Failed to set number of servers")
188+
}
172189
return false, maskAny(err)
173190
}
174191

pkg/deployment/deployment_finalizers.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ func removeDeploymentFinalizers(log zerolog.Logger, cli versioned.Interface, dep
109109
*depl = *result
110110
return nil
111111
}
112-
if err := k8sutil.RemoveFinalizers(log, finalizers, getFunc, updateFunc); err != nil {
112+
ignoreNotFound := false
113+
if err := k8sutil.RemoveFinalizers(log, finalizers, getFunc, updateFunc, ignoreNotFound); err != nil {
113114
return maskAny(err)
114115
}
115116
return nil

pkg/deployment/resources/pod_creator.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"sort"
3333
"strconv"
3434
"strings"
35+
"sync"
3536
"time"
3637

3738
"github.com/arangodb/go-driver/jwt"
@@ -428,7 +429,7 @@ func (r *Resources) createPodTolerations(group api.ServerGroup, groupSpec api.Se
428429
}
429430

430431
// createPodForMember creates all Pods listed in member status
431-
func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string) error {
432+
func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string, imageNotFoundOnce *sync.Once) error {
432433
kubecli := r.context.GetKubeCli()
433434
log := r.log
434435
apiObject := r.context.GetAPIObject()
@@ -453,7 +454,9 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string)
453454
// Find image ID
454455
imageInfo, imageFound := status.Images.GetByImage(spec.GetImage())
455456
if !imageFound {
456-
log.Debug().Str("image", spec.GetImage()).Msg("Image ID is not known yet for image")
457+
imageNotFoundOnce.Do(func() {
458+
log.Debug().Str("image", spec.GetImage()).Msg("Image ID is not known yet for image")
459+
})
457460
return nil
458461
}
459462
// Create pod
@@ -602,6 +605,7 @@ func (r *Resources) createPodForMember(spec api.DeploymentSpec, memberID string)
602605
func (r *Resources) EnsurePods() error {
603606
iterator := r.context.GetServerGroupIterator()
604607
status, _ := r.context.GetStatus()
608+
imageNotFoundOnce := &sync.Once{}
605609
if err := iterator.ForeachServerGroup(func(group api.ServerGroup, groupSpec api.ServerGroupSpec, status *api.MemberStatusList) error {
606610
for _, m := range *status {
607611
if m.Phase != api.MemberPhaseNone {
@@ -611,7 +615,7 @@ func (r *Resources) EnsurePods() error {
611615
continue
612616
}
613617
spec := r.context.GetSpec()
614-
if err := r.createPodForMember(spec, m.ID); err != nil {
618+
if err := r.createPodForMember(spec, m.ID, imageNotFoundOnce); err != nil {
615619
return maskAny(err)
616620
}
617621
}

pkg/deployment/resources/pod_finalizers.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ func (r *Resources) runPodFinalizers(ctx context.Context, p *v1.Pod, memberStatu
6262
// Remove finalizers (if needed)
6363
if len(removalList) > 0 {
6464
kubecli := r.context.GetKubeCli()
65-
if err := k8sutil.RemovePodFinalizers(log, kubecli, p, removalList); err != nil {
65+
ignoreNotFound := false
66+
if err := k8sutil.RemovePodFinalizers(log, kubecli, p, removalList, ignoreNotFound); err != nil {
6667
log.Debug().Err(err).Msg("Failed to update pod (to remove finalizers)")
6768
return maskAny(err)
6869
}

pkg/deployment/resources/pod_inspector.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ func (r *Resources) InspectPods(ctx context.Context) error {
7878
// Remove all finalizers, so it can be removed.
7979
log.Warn().Msg("Pod belongs to this deployment, but we don't know the member. Removing all finalizers")
8080
kubecli := r.context.GetKubeCli()
81-
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
81+
ignoreNotFound := false
82+
if err := k8sutil.RemovePodFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
8283
log.Debug().Err(err).Msg("Failed to update pod (to remove all finalizers)")
8384
return maskAny(err)
8485
}

pkg/deployment/resources/pvc_finalizers.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ func (r *Resources) runPVCFinalizers(ctx context.Context, p *v1.PersistentVolume
5353
// Remove finalizers (if needed)
5454
if len(removalList) > 0 {
5555
kubecli := r.context.GetKubeCli()
56-
if err := k8sutil.RemovePVCFinalizers(log, kubecli, p, removalList); err != nil {
56+
ignoreNotFound := false
57+
if err := k8sutil.RemovePVCFinalizers(log, kubecli, p, removalList, ignoreNotFound); err != nil {
5758
log.Debug().Err(err).Msg("Failed to update PVC (to remove finalizers)")
5859
return maskAny(err)
5960
}

pkg/deployment/resources/pvc_inspector.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ func (r *Resources) InspectPVCs(ctx context.Context) error {
5959
// Remove all finalizers, so it can be removed.
6060
log.Warn().Msg("PVC belongs to this deployment, but we don't know the member. Removing all finalizers")
6161
kubecli := r.context.GetKubeCli()
62-
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers()); err != nil {
62+
ignoreNotFound := false
63+
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
6364
log.Debug().Err(err).Msg("Failed to update PVC (to remove all finalizers)")
6465
return maskAny(err)
6566
}

pkg/replication/finalizers.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ func (dr *DeploymentReplication) runFinalizers(ctx context.Context, p *api.Arang
7878
}
7979
// Remove finalizers (if needed)
8080
if len(removalList) > 0 {
81-
if err := removeDeploymentReplicationFinalizers(log, dr.deps.CRCli, p, removalList); err != nil {
81+
ignoreNotFound := false
82+
if err := removeDeploymentReplicationFinalizers(log, dr.deps.CRCli, p, removalList, ignoreNotFound); err != nil {
8283
log.Debug().Err(err).Msg("Failed to update deployment replication (to remove finalizers)")
8384
return maskAny(err)
8485
}
@@ -165,7 +166,7 @@ func (dr *DeploymentReplication) inspectFinalizerDeplReplStopSync(ctx context.Co
165166
}
166167

167168
// removeDeploymentReplicationFinalizers removes the given finalizers from the given DeploymentReplication.
168-
func removeDeploymentReplicationFinalizers(log zerolog.Logger, crcli versioned.Interface, p *api.ArangoDeploymentReplication, finalizers []string) error {
169+
func removeDeploymentReplicationFinalizers(log zerolog.Logger, crcli versioned.Interface, p *api.ArangoDeploymentReplication, finalizers []string, ignoreNotFound bool) error {
169170
repls := crcli.ReplicationV1alpha().ArangoDeploymentReplications(p.GetNamespace())
170171
getFunc := func() (metav1.Object, error) {
171172
result, err := repls.Get(p.GetName(), metav1.GetOptions{})
@@ -183,7 +184,7 @@ func removeDeploymentReplicationFinalizers(log zerolog.Logger, crcli versioned.I
183184
*p = *result
184185
return nil
185186
}
186-
if err := k8sutil.RemoveFinalizers(log, finalizers, getFunc, updateFunc); err != nil {
187+
if err := k8sutil.RemoveFinalizers(log, finalizers, getFunc, updateFunc, ignoreNotFound); err != nil {
187188
return maskAny(err)
188189
}
189190
return nil

pkg/util/k8sutil/finalizers.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const (
3434
)
3535

3636
// RemovePodFinalizers removes the given finalizers from the given pod.
37-
func RemovePodFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1.Pod, finalizers []string) error {
37+
func RemovePodFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1.Pod, finalizers []string, ignoreNotFound bool) error {
3838
pods := kubecli.CoreV1().Pods(p.GetNamespace())
3939
getFunc := func() (metav1.Object, error) {
4040
result, err := pods.Get(p.GetName(), metav1.GetOptions{})
@@ -52,14 +52,14 @@ func RemovePodFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1
5252
*p = *result
5353
return nil
5454
}
55-
if err := RemoveFinalizers(log, finalizers, getFunc, updateFunc); err != nil {
55+
if err := RemoveFinalizers(log, finalizers, getFunc, updateFunc, ignoreNotFound); err != nil {
5656
return maskAny(err)
5757
}
5858
return nil
5959
}
6060

6161
// RemovePVCFinalizers removes the given finalizers from the given PVC.
62-
func RemovePVCFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1.PersistentVolumeClaim, finalizers []string) error {
62+
func RemovePVCFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1.PersistentVolumeClaim, finalizers []string, ignoreNotFound bool) error {
6363
pvcs := kubecli.CoreV1().PersistentVolumeClaims(p.GetNamespace())
6464
getFunc := func() (metav1.Object, error) {
6565
result, err := pvcs.Get(p.GetName(), metav1.GetOptions{})
@@ -77,7 +77,7 @@ func RemovePVCFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1
7777
*p = *result
7878
return nil
7979
}
80-
if err := RemoveFinalizers(log, finalizers, getFunc, updateFunc); err != nil {
80+
if err := RemoveFinalizers(log, finalizers, getFunc, updateFunc, ignoreNotFound); err != nil {
8181
return maskAny(err)
8282
}
8383
return nil
@@ -87,12 +87,16 @@ func RemovePVCFinalizers(log zerolog.Logger, kubecli kubernetes.Interface, p *v1
8787
// The functions tries to get the object using the provided get function,
8888
// then remove the given finalizers and update the update using the given update function.
8989
// In case of an update conflict, the functions tries again.
90-
func RemoveFinalizers(log zerolog.Logger, finalizers []string, getFunc func() (metav1.Object, error), updateFunc func(metav1.Object) error) error {
90+
func RemoveFinalizers(log zerolog.Logger, finalizers []string, getFunc func() (metav1.Object, error), updateFunc func(metav1.Object) error, ignoreNotFound bool) error {
9191
attempts := 0
9292
for {
9393
attempts++
9494
obj, err := getFunc()
9595
if err != nil {
96+
if IsNotFound(err) && ignoreNotFound {
97+
// Object no longer found and we're allowed to ignore that.
98+
return nil
99+
}
96100
log.Warn().Err(err).Msg("Failed to get resource")
97101
return maskAny(err)
98102
}
@@ -125,6 +129,9 @@ func RemoveFinalizers(log zerolog.Logger, finalizers []string, getFunc func() (m
125129
// Try again
126130
continue
127131
}
132+
} else if IsNotFound(err) && ignoreNotFound {
133+
// Object no longer found and we're allowed to ignore that.
134+
return nil
128135
} else if err != nil {
129136
log.Warn().Err(err).Msg("Failed to update resource with fewer finalizers")
130137
return maskAny(err)

0 commit comments

Comments
 (0)