From 8554d8e0db0702d3fdf4e19b11791549b03c478e Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Mon, 28 Nov 2016 11:56:21 -0800 Subject: [PATCH] fix concurrent read/write to map error caused by SetInitContainersAndStatuses in kubelet --- pkg/kubelet/config/apiserver.go | 8 +------- pkg/kubelet/config/config.go | 12 ++++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/pkg/kubelet/config/apiserver.go b/pkg/kubelet/config/apiserver.go index ae59ecb434c..6930f38607a 100644 --- a/pkg/kubelet/config/apiserver.go +++ b/pkg/kubelet/config/apiserver.go @@ -18,10 +18,8 @@ limitations under the License. package config import ( - "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" - podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/client/cache" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" "k8s.io/kubernetes/pkg/fields" @@ -40,11 +38,7 @@ func newSourceApiserverFromLW(lw cache.ListerWatcher, updates chan<- interface{} send := func(objs []interface{}) { var pods []*v1.Pod for _, o := range objs { - pod := o.(*v1.Pod) - if err := podutil.SetInitContainersAndStatuses(pod); err != nil { - glog.Error(err) - } - pods = append(pods, pod) + pods = append(pods, o.(*v1.Pod)) } updates <- kubetypes.PodUpdate{Pods: pods, Op: kubetypes.SET, Source: kubetypes.ApiserverSource} } diff --git a/pkg/kubelet/config/config.go b/pkg/kubelet/config/config.go index 1266878ed91..f1b784813c9 100644 --- a/pkg/kubelet/config/config.go +++ b/pkg/kubelet/config/config.go @@ -24,6 +24,7 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" + podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/client/record" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" @@ -254,6 +255,17 @@ func (s *podStorage) merge(source string, change interface{}) (adds, updates, de } update := change.(kubetypes.PodUpdate) + // The InitContainers and InitContainerStatuses fields are lost during + // serialization and deserialization. They are conveyed via Annotations. + // Setting these fields here so that kubelet doesn't have to check for + // annotations. + if source == kubetypes.ApiserverSource { + for _, pod := range update.Pods { + if err := podutil.SetInitContainersAndStatuses(pod); err != nil { + glog.Error(err) + } + } + } switch update.Op { case kubetypes.ADD, kubetypes.UPDATE, kubetypes.DELETE: if update.Op == kubetypes.ADD {