From 445ec719c9ecb0d7ffd2f08aab0b141ea0bedee0 Mon Sep 17 00:00:00 2001 From: Dawn Chen Date: Thu, 30 Oct 2014 10:45:22 -0700 Subject: [PATCH] PodUpdate only has the delta changes, not full snapshot of all desired BoundPods on a node. PR #1865 has a wrong assumption, with which any PodUpdate operation will cause rest of running containers without updates are killed as an unexpected ones. Fix #2028 --- pkg/kubelet/kubelet.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index ebd6107d4aa..cd079013ffc 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -755,6 +755,28 @@ func (kl *Kubelet) SyncPods(pods []api.BoundPod) error { return err } +func updateBoundPods(changed []api.BoundPod, current []api.BoundPod) []api.BoundPod { + updated := []api.BoundPod{} + m := map[string]*api.BoundPod{} + for i := range changed { + pod := &changed[i] + m[pod.UID] = pod + } + + for i := range current { + pod := ¤t[i] + if m[pod.UID] != nil { + updated = append(updated, *m[pod.UID]) + glog.V(4).Infof("pod with UID: %s has a new spec %+v", pod.UID, *m[pod.UID]) + } else { + updated = append(updated, *pod) + glog.V(4).Infof("pod with UID: %s stay with the same spec %+v", pod.UID, *pod) + } + } + + return updated +} + // filterHostPortConflicts removes pods that conflict on Port.HostPort values func filterHostPortConflicts(pods []api.BoundPod) []api.BoundPod { filtered := []api.BoundPod{} @@ -782,10 +804,14 @@ func (kl *Kubelet) syncLoop(updates <-chan PodUpdate, handler SyncHandler) { select { case u := <-updates: switch u.Op { - case SET, UPDATE: - glog.V(3).Infof("Containers changed") + case SET: + glog.V(3).Infof("SET: Containers changed") kl.pods = u.Pods kl.pods = filterHostPortConflicts(kl.pods) + case UPDATE: + glog.V(3).Infof("Update: Containers changed") + kl.pods = updateBoundPods(u.Pods, kl.pods) + kl.pods = filterHostPortConflicts(kl.pods) default: panic("syncLoop does not support incremental changes")