controller: adopt pods only when controller is not deleted

This commit is contained in:
Michail Kargakis 2016-12-12 14:42:18 +01:00
parent 59c313730c
commit ec2c79a35e
2 changed files with 25 additions and 36 deletions

View File

@ -577,15 +577,6 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error {
} }
rs := *obj.(*extensions.ReplicaSet) 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) rsNeedsSync := rsc.expectations.SatisfiedExpectations(key)
selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector) selector, err := metav1.LabelSelectorAsSelector(rs.Spec.Selector)
if err != nil { if err != nil {
@ -606,6 +597,8 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error {
} }
cm := controller.NewPodControllerRefManager(rsc.podControl, rs.ObjectMeta, selector, getRSKind()) cm := controller.NewPodControllerRefManager(rsc.podControl, rs.ObjectMeta, selector, getRSKind())
matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods) matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods)
// Adopt pods only if this replica set is not going to be deleted.
if rs.DeletionTimestamp == nil {
for _, pod := range matchesNeedsController { for _, pod := range matchesNeedsController {
err := cm.AdoptPod(pod) err := cm.AdoptPod(pod)
// continue to next pod if adoption fails. // continue to next pod if adoption fails.
@ -618,6 +611,7 @@ func (rsc *ReplicaSetController) syncReplicaSet(key string) error {
matchesAndControlled = append(matchesAndControlled, pod) matchesAndControlled = append(matchesAndControlled, pod)
} }
} }
}
filteredPods = matchesAndControlled filteredPods = matchesAndControlled
// remove the controllerRef for the pods that no longer have matching labels // remove the controllerRef for the pods that no longer have matching labels
var errlist []error var errlist []error

View File

@ -666,16 +666,8 @@ func (rm *ReplicationManager) syncReplicationController(key string) error {
} }
rc := *obj.(*v1.ReplicationController) 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") trace.Step("ReplicationController restored")
rcNeedsSync := rm.expectations.SatisfiedExpectations(rcKey) rcNeedsSync := rm.expectations.SatisfiedExpectations(key)
trace.Step("Expectations restored") trace.Step("Expectations restored")
// NOTE: filteredPods are pointing to objects from cache - if you need to // NOTE: filteredPods are pointing to objects from cache - if you need to
@ -693,6 +685,8 @@ func (rm *ReplicationManager) syncReplicationController(key string) error {
} }
cm := controller.NewPodControllerRefManager(rm.podControl, rc.ObjectMeta, labels.Set(rc.Spec.Selector).AsSelectorPreValidated(), getRCKind()) cm := controller.NewPodControllerRefManager(rm.podControl, rc.ObjectMeta, labels.Set(rc.Spec.Selector).AsSelectorPreValidated(), getRCKind())
matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods) matchesAndControlled, matchesNeedsController, controlledDoesNotMatch := cm.Classify(pods)
// Adopt pods only if this replication controller is not going to be deleted.
if rc.DeletionTimestamp == nil {
for _, pod := range matchesNeedsController { for _, pod := range matchesNeedsController {
err := cm.AdoptPod(pod) err := cm.AdoptPod(pod)
// continue to next pod if adoption fails. // continue to next pod if adoption fails.
@ -705,6 +699,7 @@ func (rm *ReplicationManager) syncReplicationController(key string) error {
matchesAndControlled = append(matchesAndControlled, pod) matchesAndControlled = append(matchesAndControlled, pod)
} }
} }
}
filteredPods = matchesAndControlled filteredPods = matchesAndControlled
// remove the controllerRef for the pods that no longer have matching labels // remove the controllerRef for the pods that no longer have matching labels
var errlist []error var errlist []error