From 62afa3de7102b6b6e055113d9d50f15eeb42e2cf Mon Sep 17 00:00:00 2001 From: Michail Kargakis Date: Tue, 28 Jun 2016 13:31:03 +0200 Subject: [PATCH] controller: update all rs annotations on a scaled rollout When a new rollout with a different size than the previous size of the deployment is initiated then only the new replica set will notice the new size. Old replica sets are not updated by the rollout path. --- .../deployment/deployment_controller.go | 6 +++++- pkg/controller/deployment/sync.go | 21 ++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 8587334dacc..8bbc62618bf 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -499,7 +499,11 @@ func (dc *DeploymentController) syncDeployment(key string) error { } } - if dc.isScalingEvent(d) { + scalingEvent, err := dc.isScalingEvent(d) + if err != nil { + return err + } + if scalingEvent { return dc.sync(d) } diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index a9f97b2757f..e6c82af1b90 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -510,15 +510,26 @@ func (dc *DeploymentController) updateDeploymentStatus(allRSs []*extensions.Repl // isScalingEvent checks whether the provided deployment has been updated with a scaling event // by looking at the desired-replicas annotation in the active replica sets of the deployment. -func (dc *DeploymentController) isScalingEvent(d *extensions.Deployment) bool { +func (dc *DeploymentController) isScalingEvent(d *extensions.Deployment) (bool, error) { newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, false) if err != nil { - return false + return false, err } // If there is no new replica set matching this deployment and the deployment isn't paused // then there is a new rollout that waits to happen if newRS == nil && !d.Spec.Paused { - return false + // Update all active replicas sets to the new deployment size. SetReplicasAnnotations makes + // sure that we will update only replica sets that don't have the current size of the deployment. + maxSurge := deploymentutil.MaxSurge(*d) + for _, rs := range controller.FilterActiveReplicaSets(oldRSs) { + if updated := deploymentutil.SetReplicasAnnotations(rs, d.Spec.Replicas, d.Spec.Replicas+maxSurge); updated { + if _, err := dc.client.Extensions().ReplicaSets(rs.Namespace).Update(rs); err != nil { + glog.Infof("Cannot update annotations for replica set %q: %v", rs.Name, err) + return false, err + } + } + } + return false, nil } allRSs := append(oldRSs, newRS) for _, rs := range controller.FilterActiveReplicaSets(allRSs) { @@ -527,8 +538,8 @@ func (dc *DeploymentController) isScalingEvent(d *extensions.Deployment) bool { continue } if desired != d.Spec.Replicas { - return true + return true, nil } } - return false + return false, nil }