diff --git a/pkg/controller/garbagecollector/graph_builder.go b/pkg/controller/garbagecollector/graph_builder.go index f1020047483..525e357c201 100644 --- a/pkg/controller/garbagecollector/graph_builder.go +++ b/pkg/controller/garbagecollector/graph_builder.go @@ -427,15 +427,14 @@ func referencesDiffs(old []metav1.OwnerReference, new []metav1.OwnerReference) ( return added, removed, changed } -// returns if the object in the event just transitions to "being deleted". -func deletionStarts(oldObj interface{}, newAccessor metav1.Object) bool { - // The delta_fifo may combine the creation and update of the object into one - // event, so if there is no oldObj, we just return if the newObj (via - // newAccessor) is being deleted. +func deletionStartsWithFinalizer(oldObj interface{}, newAccessor metav1.Object, matchingFinalizer string) bool { + // if the new object isn't being deleted, or doesn't have the finalizer we're interested in, return false + if !beingDeleted(newAccessor) || !hasFinalizer(newAccessor, matchingFinalizer) { + return false + } + + // if the old object is nil, or wasn't being deleted, or didn't have the finalizer, return true if oldObj == nil { - if newAccessor.GetDeletionTimestamp() == nil { - return false - } return true } oldAccessor, err := meta.Accessor(oldObj) @@ -443,7 +442,7 @@ func deletionStarts(oldObj interface{}, newAccessor metav1.Object) bool { utilruntime.HandleError(fmt.Errorf("cannot access oldObj: %v", err)) return false } - return beingDeleted(newAccessor) && !beingDeleted(oldAccessor) + return !beingDeleted(oldAccessor) || !hasFinalizer(oldAccessor, matchingFinalizer) } func beingDeleted(accessor metav1.Object) bool { @@ -471,13 +470,13 @@ func hasFinalizer(accessor metav1.Object, matchingFinalizer string) bool { // this function takes newAccessor directly because the caller already // instantiates an accessor for the newObj. func startsWaitingForDependentsDeleted(oldObj interface{}, newAccessor metav1.Object) bool { - return deletionStarts(oldObj, newAccessor) && hasDeleteDependentsFinalizer(newAccessor) + return deletionStartsWithFinalizer(oldObj, newAccessor, metav1.FinalizerDeleteDependents) } // this function takes newAccessor directly because the caller already // instantiates an accessor for the newObj. func startsWaitingForDependentsOrphaned(oldObj interface{}, newAccessor metav1.Object) bool { - return deletionStarts(oldObj, newAccessor) && hasOrphanFinalizer(newAccessor) + return deletionStartsWithFinalizer(oldObj, newAccessor, metav1.FinalizerOrphanDependents) } // if an blocking ownerReference points to an object gets removed, or gets set to