@@ -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"}]'
275275func (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
322333func podNameFromTask (name string ) string {
0 commit comments