From ec2c79a35e2808ce178bf841523a8f56c55a6056 Mon Sep 17 00:00:00 2001 From: Michail Kargakis Date: Mon, 12 Dec 2016 14:42:18 +0100 Subject: [PATCH] controller: adopt pods only when controller is not deleted --- pkg/controller/replicaset/replica_set.go | 30 +++++++----------- .../replication/replication_controller.go | 31 ++++++++----------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/pkg/controller/replicaset/replica_set.go b/pkg/controller/replicaset/replica_set.go index 0b1208a0fa9..9ba593c6780 100644 --- a/pkg/controller/replicaset/replica_set.go +++ b/pkg/controller/replicaset/replica_set.go @@ -577,15 +577,6 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error { } rs := *obj.(*extensions.ReplicaSet) - // Check the expectations of the ReplicaSet before counting active pods, otherwise a new pod can sneak - // in and update the expectations after we've retrieved active pods from the store. If a new pod enters - // the store after we've checked the expectation, the ReplicaSet sync is just deferred till the next - // relist. - if err != nil { - utilruntime.HandleError(fmt.Errorf("Couldn't get key for ReplicaSet %#v: %v", rs, err)) - // Explicitly return nil to avoid re-enqueue bad key - return nil - } rsNeedsSync := rsc.expectations.SatisfiedExpectations(key) selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector) if err != nil { @@ -606,16 +597,19 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error { } cm := controller.NewPodControllerRefManager(rsc.podControl, rs.ObjectMeta, selector, getRSKind()) matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods) - for _, pod := range matchesNeedsController { - err := cm.AdoptPod(pod) - // continue to next pod if adoption fails. - if err != nil { - // If the pod no longer exists, don't even log the error. - if !errors.IsNotFound(err) { - utilruntime.HandleError(err) + // Adopt pods only if this replica set is not going to be deleted. + if rs.DeletionTimestamp == nil { + for _, pod := range matchesNeedsController { + err := cm.AdoptPod(pod) + // continue to next pod if adoption fails. + if err != nil { + // If the pod no longer exists, don't even log the error. + if !errors.IsNotFound(err) { + utilruntime.HandleError(err) + } + } else { + matchesAndControlled = append(matchesAndControlled, pod) } - } else { - matchesAndControlled = append(matchesAndControlled, pod) } } filteredPods = matchesAndControlled diff --git a/pkg/controller/replication/replication_controller.go b/pkg/controller/replication/replication_controller.go index 7f01dc8bb45..a82187eb9fa 100644 --- a/pkg/controller/replication/replication_controller.go +++ b/pkg/controller/replication/replication_controller.go @@ -666,16 +666,8 @@ func (rm *ReplicationManager) syncReplicationController(key string) error { } rc := *obj.(*v1.ReplicationController) - // Check the expectations of the rc before counting active pods, otherwise a new pod can sneak in - // and update the expectations after we've retrieved active pods from the store. If a new pod enters - // the store after we've checked the expectation, the rc sync is just deferred till the next relist. - rcKey, err := controller.KeyFunc(&rc) - if err != nil { - glog.Errorf("Couldn't get key for replication controller %#v: %v", rc, err) - return err - } trace.Step("ReplicationController restored") - rcNeedsSync := rm.expectations.SatisfiedExpectations(rcKey) + rcNeedsSync := rm.expectations.SatisfiedExpectations(key) trace.Step("Expectations restored") // NOTE: filteredPods are pointing to objects from cache - if you need to @@ -693,16 +685,19 @@ func (rm *ReplicationManager) syncReplicationController(key string) error { } cm := controller.NewPodControllerRefManager(rm.podControl, rc.ObjectMeta, labels.Set(rc.Spec.Selector).AsSelectorPreValidated(), getRCKind()) matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods) - for _, pod := range matchesNeedsController { - err := cm.AdoptPod(pod) - // continue to next pod if adoption fails. - if err != nil { - // If the pod no longer exists, don't even log the error. - if !errors.IsNotFound(err) { - utilruntime.HandleError(err) + // Adopt pods only if this replication controller is not going to be deleted. + if rc.DeletionTimestamp == nil { + for _, pod := range matchesNeedsController { + err := cm.AdoptPod(pod) + // continue to next pod if adoption fails. + if err != nil { + // If the pod no longer exists, don't even log the error. + if !errors.IsNotFound(err) { + utilruntime.HandleError(err) + } + } else { + matchesAndControlled = append(matchesAndControlled, pod) } - } else { - matchesAndControlled = append(matchesAndControlled, pod) } } filteredPods = matchesAndControlled