Skip to content

Commit c874af4

Browse files
committed
Inspect PVCs again quickly when finalizers cannot (yet) be removed
1 parent 44d1fae commit c874af4

File tree

5 files changed

+31
-15
lines changed

5 files changed

+31
-15
lines changed

pkg/deployment/deployment_inspector.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,11 @@ func (d *Deployment) inspectDeployment(lastInterval time.Duration) time.Duration
9494
} else {
9595
nextInterval = util.MinDuration(nextInterval, x)
9696
}
97-
if err := d.resources.InspectPVCs(ctx); err != nil {
97+
if x, err := d.resources.InspectPVCs(ctx); err != nil {
9898
hasError = true
9999
d.CreateEvent(k8sutil.NewErrorEvent("PVC inspection failed", err, d.apiObject))
100+
} else {
101+
nextInterval = util.MinDuration(nextInterval, x)
100102
}
101103

102104
// Check members for resilience

pkg/deployment/resources/pod_finalizers.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import (
3636
)
3737

3838
const (
39-
recheckPodFinalizerInterval = time.Second * 10
39+
recheckPodFinalizerInterval = time.Second * 10 // Interval used when Pod finalizers need to be rechecked soon
4040
)
4141

4242
// runPodFinalizers goes through the list of pod finalizers to see if they can be removed.
@@ -69,9 +69,8 @@ func (r *Resources) runPodFinalizers(ctx context.Context, p *v1.Pod, memberStatu
6969
if err := k8sutil.RemovePodFinalizers(log, kubecli, p, removalList, ignoreNotFound); err != nil {
7070
log.Debug().Err(err).Msg("Failed to update pod (to remove finalizers)")
7171
return 0, maskAny(err)
72-
} else {
73-
log.Debug().Strs("finalizers", removalList).Msg("Removed finalizer(s) from Pod")
7472
}
73+
log.Debug().Strs("finalizers", removalList).Msg("Removed finalizer(s) from Pod")
7574
} else {
7675
// Check again at given interval
7776
return recheckPodFinalizerInterval, nil

pkg/deployment/resources/pod_inspector.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var (
4141

4242
const (
4343
podScheduleTimeout = time.Minute // How long we allow the schedule to take scheduling a pod.
44-
maxPodInspectorInterval = time.Hour
44+
maxPodInspectorInterval = time.Hour // Maximum time between Pod inspection (if nothing else happens)
4545
)
4646

4747
// InspectPods lists all pods that belong to the given deployment and updates

pkg/deployment/resources/pvc_finalizers.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ package resources
2525
import (
2626
"context"
2727
"fmt"
28+
"time"
2829

2930
"github.com/rs/zerolog"
3031
"k8s.io/api/core/v1"
@@ -35,8 +36,13 @@ import (
3536
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3637
)
3738

39+
const (
40+
recheckPVCFinalizerInterval = time.Second * 10 // Interval used when PVC finalizers need to be rechecked soon
41+
)
42+
3843
// runPVCFinalizers goes through the list of PVC finalizers to see if they can be removed.
39-
func (r *Resources) runPVCFinalizers(ctx context.Context, p *v1.PersistentVolumeClaim, group api.ServerGroup, memberStatus api.MemberStatus, updateMember func(api.MemberStatus) error) error {
44+
// Returns: Interval_till_next_inspection, error
45+
func (r *Resources) runPVCFinalizers(ctx context.Context, p *v1.PersistentVolumeClaim, group api.ServerGroup, memberStatus api.MemberStatus, updateMember func(api.MemberStatus) error) (time.Duration, error) {
4046
log := r.log.With().Str("pvc-name", p.GetName()).Logger()
4147
var removalList []string
4248
for _, f := range p.ObjectMeta.GetFinalizers() {
@@ -56,12 +62,15 @@ func (r *Resources) runPVCFinalizers(ctx context.Context, p *v1.PersistentVolume
5662
ignoreNotFound := false
5763
if err := k8sutil.RemovePVCFinalizers(log, kubecli, p, removalList, ignoreNotFound); err != nil {
5864
log.Debug().Err(err).Msg("Failed to update PVC (to remove finalizers)")
59-
return maskAny(err)
65+
return 0, maskAny(err)
6066
} else {
6167
log.Debug().Strs("finalizers", removalList).Msg("Removed finalizer(s) from PVC")
6268
}
69+
} else {
70+
// Check again at given interval
71+
return recheckPVCFinalizerInterval, nil
6372
}
64-
return nil
73+
return maxPVCInspectorInterval, nil
6574
}
6675

6776
// inspectFinalizerPVCMemberExists checks the finalizer condition for member-exists.

pkg/deployment/resources/pvc_inspector.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,29 @@ package resources
2424

2525
import (
2626
"context"
27+
"time"
2728

2829
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
2930
"github.com/arangodb/kube-arangodb/pkg/metrics"
31+
"github.com/arangodb/kube-arangodb/pkg/util"
3032
"github.com/arangodb/kube-arangodb/pkg/util/k8sutil"
3133
)
3234

3335
var (
34-
inspectedPVCCounter = metrics.MustRegisterCounter("deployment", "inspected_ppvcs", "Number of PVCs inspections")
36+
inspectedPVCCounter = metrics.MustRegisterCounter("deployment", "inspected_ppvcs", "Number of PVCs inspections")
37+
maxPVCInspectorInterval = time.Hour // Maximum time between PVC inspection (if nothing else happens)
3538
)
3639

3740
// InspectPVCs lists all PVCs that belong to the given deployment and updates
3841
// the member status of the deployment accordingly.
39-
func (r *Resources) InspectPVCs(ctx context.Context) error {
42+
func (r *Resources) InspectPVCs(ctx context.Context) (time.Duration, error) {
4043
log := r.log
44+
nextInterval := maxPVCInspectorInterval
4145

4246
pvcs, err := r.context.GetOwnedPVCs()
4347
if err != nil {
4448
log.Debug().Err(err).Msg("Failed to get owned PVCs")
45-
return maskAny(err)
49+
return 0, maskAny(err)
4650
}
4751

4852
// Update member status from all pods found
@@ -63,7 +67,7 @@ func (r *Resources) InspectPVCs(ctx context.Context) error {
6367
ignoreNotFound := false
6468
if err := k8sutil.RemovePVCFinalizers(log, kubecli, &p, p.GetFinalizers(), ignoreNotFound); err != nil {
6569
log.Debug().Err(err).Msg("Failed to update PVC (to remove all finalizers)")
66-
return maskAny(err)
70+
return 0, maskAny(err)
6771
}
6872
}
6973
continue
@@ -72,21 +76,23 @@ func (r *Resources) InspectPVCs(ctx context.Context) error {
7276
updateMemberStatusNeeded := false
7377
if k8sutil.IsPersistentVolumeClaimMarkedForDeletion(&p) {
7478
// Process finalizers
75-
if err := r.runPVCFinalizers(ctx, &p, group, memberStatus, func(m api.MemberStatus) error {
79+
if x, err := r.runPVCFinalizers(ctx, &p, group, memberStatus, func(m api.MemberStatus) error {
7680
updateMemberStatusNeeded = true
7781
memberStatus = m
7882
return nil
7983
}); err != nil {
8084
// Only log here, since we'll be called to try again.
8185
log.Warn().Err(err).Msg("Failed to run PVC finalizers")
86+
} else {
87+
nextInterval = util.MinDuration(nextInterval, x)
8288
}
8389
}
8490
if updateMemberStatusNeeded {
8591
if err := status.Members.Update(memberStatus, group); err != nil {
86-
return maskAny(err)
92+
return 0, maskAny(err)
8793
}
8894
}
8995
}
9096

91-
return nil
97+
return nextInterval, nil
9298
}

0 commit comments

Comments
 (0)