fix concurrent read/write to map error caused by SetInitContainersAndStatuses in kubelet

This commit is contained in:
Chao Xu 2016-11-28 11:56:21 -08:00
parent 545f749a0d
commit 8554d8e0db
2 changed files with 13 additions and 7 deletions

View File

@ -18,10 +18,8 @@ limitations under the License.
package config package config
import ( import (
"github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@ -40,11 +38,7 @@ func newSourceApiserverFromLW(lw cache.ListerWatcher, updates chan<- interface{}
send := func(objs []interface{}) { send := func(objs []interface{}) {
var pods []*v1.Pod var pods []*v1.Pod
for _, o := range objs { for _, o := range objs {
pod := o.(*v1.Pod) pods = append(pods, o.(*v1.Pod))
if err := podutil.SetInitContainersAndStatuses(pod); err != nil {
glog.Error(err)
}
pods = append(pods, pod)
} }
updates <- kubetypes.PodUpdate{Pods: pods, Op: kubetypes.SET, Source: kubetypes.ApiserverSource} updates <- kubetypes.PodUpdate{Pods: pods, Op: kubetypes.SET, Source: kubetypes.ApiserverSource}
} }

View File

@ -24,6 +24,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/client/record" "k8s.io/kubernetes/pkg/client/record"
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" 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) 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 { switch update.Op {
case kubetypes.ADD, kubetypes.UPDATE, kubetypes.DELETE: case kubetypes.ADD, kubetypes.UPDATE, kubetypes.DELETE:
if update.Op == kubetypes.ADD { if update.Op == kubetypes.ADD {