diff --git a/pkg/controller/controller_ref_manager.go b/pkg/controller/controller_ref_manager.go index cffcc7795cf..507995c004d 100644 --- a/pkg/controller/controller_ref_manager.go +++ b/pkg/controller/controller_ref_manager.go @@ -113,6 +113,10 @@ func (m *baseControllerRefManager) claimObject(obj metav1.Object, match func(met // Ignore if we're being deleted or selector doesn't match. return false, nil } + if obj.GetDeletionTimestamp() != nil { + // Ignore if the object is being deleted + return false, nil + } // Selector matches. Try to adopt. if err := adopt(obj); err != nil { // If the pod no longer exists, ignore the error. diff --git a/pkg/controller/controller_ref_manager_test.go b/pkg/controller/controller_ref_manager_test.go index 80e176e3de7..6a3045f83f2 100644 --- a/pkg/controller/controller_ref_manager_test.go +++ b/pkg/controller/controller_ref_manager_test.go @@ -155,6 +155,26 @@ func TestClaimPods(t *testing.T) { claimed: []*v1.Pod{newPod("pod1", productionLabel, &controller)}, } }(), + func() test { + controller := v1.ReplicationController{} + controller.UID = types.UID(controllerUID) + podToDelete1 := newPod("pod1", productionLabel, &controller) + podToDelete2 := newPod("pod2", productionLabel, nil) + now := metav1.Now() + podToDelete1.DeletionTimestamp = &now + podToDelete2.DeletionTimestamp = &now + + return test{ + name: "Controller does not claim orphaned pods marked for deletion", + manager: NewPodControllerRefManager(&FakePodControl{}, + &controller, + productionLabelSelector, + controllerKind, + func() error { return nil }), + pods: []*v1.Pod{podToDelete1, podToDelete2}, + claimed: []*v1.Pod{podToDelete1}, + } + }(), } for _, test := range tests { claimed, err := test.manager.ClaimPods(test.pods)