Skip to content

Commit 9b20acf

Browse files
committed
fixup! [control-operator] finalizer blocks deletion of task until all pods are gone
1 parent 9b26f2a commit 9b20acf

1 file changed

Lines changed: 49 additions & 38 deletions

File tree

control-operator/internal/controller/task_controller.go

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -274,49 +274,60 @@ func (r *TaskReconciler) consumeGRPCConsumerIfReady(ctx context.Context, t *alie
274274
// kubectl patch task --type=json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
275275
func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (ctrl.Result, bool, error) {
276276
if t.DeletionTimestamp.IsZero() {
277-
if !controllerutil.ContainsFinalizer(t, taskFinalizer) {
278-
controllerutil.AddFinalizer(t, taskFinalizer)
279-
if err := r.Update(ctx, t); err != nil {
280-
return ctrl.Result{}, true, err
281-
}
282-
return ctrl.Result{}, true, nil
277+
if controllerutil.AddFinalizer(t, taskFinalizer) {
278+
return ctrl.Result{}, true, r.Update(ctx, t)
283279
}
284-
} else {
285-
if controllerutil.ContainsFinalizer(t, taskFinalizer) {
286-
log.Info("Finalizer found, starting cleanup")
287-
if client, exists := clientsForContainers[t.Name]; exists {
288-
log.Info("Cleaning up gRPC connection before deletion")
289-
if err := client.Close(); err != nil {
290-
log.Error(err, "Failed to close gRPC client during deletion")
291-
}
292-
delete(clientsForContainers, t.Name)
293-
log.Info("gRPC cleaned")
294-
}
280+
return ctrl.Result{}, false, nil
281+
}
295282

296-
pod := &v1.Pod{}
297-
err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod)
298-
if err == nil {
299-
if pod.DeletionTimestamp.IsZero() {
300-
log.Info("Deleting pod before removing finalizer")
301-
if err := r.Delete(ctx, pod); err != nil && !errors.IsNotFound(err) {
302-
return ctrl.Result{}, true, err
303-
}
304-
}
305-
log.Info("Waiting for pod to terminate before removing finalizer")
306-
return ctrl.Result{}, true, nil
307-
} else if !errors.IsNotFound(err) {
308-
return ctrl.Result{}, true, err
309-
}
310-
log.Info("POD cleaned")
283+
if !controllerutil.ContainsFinalizer(t, taskFinalizer) {
284+
return ctrl.Result{}, true, nil
285+
}
311286

312-
controllerutil.RemoveFinalizer(t, taskFinalizer)
313-
if err := r.Update(ctx, t); err != nil {
314-
return ctrl.Result{}, true, err
315-
}
287+
log.Info("Finalizer found, starting cleanup")
288+
r.cleargRPC(t, log)
289+
290+
podGone, err := r.podDeleted(ctx, t, log)
291+
if err != nil || !podGone {
292+
return ctrl.Result{}, true, err
293+
}
294+
295+
controllerutil.RemoveFinalizer(t, taskFinalizer)
296+
return ctrl.Result{}, true, r.Update(ctx, t)
297+
}
298+
299+
// podDeleted deletes the Task's Pod if it still exists, and reports whether it is
300+
// fully gone yet so the caller can wait for termination before removing the finalizer.
301+
func (r *TaskReconciler) podDeleted(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (bool, error) {
302+
pod := &v1.Pod{}
303+
err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod)
304+
if errors.IsNotFound(err) {
305+
log.Info("POD cleaned")
306+
return true, nil
307+
}
308+
if err != nil {
309+
return false, err
310+
}
311+
312+
if pod.DeletionTimestamp.IsZero() {
313+
log.Info("Deleting pod before removing finalizer")
314+
if err := r.Delete(ctx, pod); err != nil && !errors.IsNotFound(err) {
315+
return false, err
316316
}
317-
return ctrl.Result{}, true, nil
318317
}
319-
return ctrl.Result{}, false, nil
318+
log.Info("Waiting for pod to terminate before removing finalizer")
319+
return false, nil
320+
}
321+
322+
func (*TaskReconciler) cleargRPC(t *aliecsv1alpha1.Task, log logr.Logger) {
323+
if client, exists := clientsForContainers[t.Name]; exists {
324+
log.Info("Cleaning up gRPC connection")
325+
if err := client.Close(); err != nil {
326+
log.Error(err, "Failed to close gRPC client during deletion")
327+
}
328+
delete(clientsForContainers, t.Name)
329+
log.Info("gRPC cleaned")
330+
}
320331
}
321332

322333
func podNameFromTask(name string) string {

0 commit comments

Comments
 (0)