From 7de6a253839fe0c46bea71905b1e59d7ea5935ce Mon Sep 17 00:00:00 2001 From: Vishnu kannan Date: Tue, 16 Feb 2016 12:52:40 -0800 Subject: [PATCH] Identify runtime's cgroups periodically to avoid race with runtime uptime. The runtime could also move between cgroups. Signed-off-by: Vishnu kannan --- pkg/kubelet/cm/container_manager_linux.go | 42 +++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/pkg/kubelet/cm/container_manager_linux.go b/pkg/kubelet/cm/container_manager_linux.go index 43fa7bedb15..a31aa203496 100644 --- a/pkg/kubelet/cm/container_manager_linux.go +++ b/pkg/kubelet/cm/container_manager_linux.go @@ -24,6 +24,7 @@ import ( "os/exec" "strconv" "strings" + "sync" "time" "github.com/golang/glog" @@ -74,11 +75,13 @@ func newSystemCgroups(containerName string) *systemContainer { } type containerManagerImpl struct { + sync.RWMutex cadvisorInterface cadvisor.Interface mountUtil mount.Interface NodeConfig // External containers being managed. systemContainers []*systemContainer + periodicTasks []func() } var _ ContainerManager = &containerManagerImpl{} @@ -225,12 +228,16 @@ func (cm *containerManagerImpl) setupNode() error { } systemContainers = append(systemContainers, cont) } else { - cont, err := getContainerNameForProcess("docker") - if err != nil { - glog.Error(err) - } else { + cm.periodicTasks = append(cm.periodicTasks, func() { + cont, err := getContainerNameForProcess("docker") + if err != nil { + glog.Error(err) + return + } + cm.Lock() + defer cm.Unlock() cm.RuntimeCgroupsName = cont - } + }) } } @@ -267,12 +274,17 @@ func (cm *containerManagerImpl) setupNode() error { } systemContainers = append(systemContainers, cont) } else { - cont, err := getContainer(os.Getpid()) - if err != nil { - glog.Error("failed to find cgroups of kubelet - %v", err) - } else { + cm.periodicTasks = append(cm.periodicTasks, func() { + cont, err := getContainer(os.Getpid()) + if err != nil { + glog.Error("failed to find cgroups of kubelet - %v", err) + return + } + cm.Lock() + defer cm.Unlock() + cm.KubeletCgroupsName = cont - } + }) } cm.systemContainers = systemContainers @@ -295,6 +307,8 @@ func getContainerNameForProcess(name string) (string, error) { } func (cm *containerManagerImpl) GetNodeConfig() NodeConfig { + cm.RLock() + defer cm.RUnlock() return cm.NodeConfig } @@ -325,6 +339,14 @@ func (cm *containerManagerImpl) Start() error { } }, time.Minute, wait.NeverStop) + go wait.Until(func() { + for _, task := range cm.periodicTasks { + if task != nil { + task() + } + } + }, 5*time.Minute, wait.NeverStop) + return nil }