From 9ce178f7077e858c8292d0c0367c6800b799b87e Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 19 Mar 2015 16:33:51 -0400 Subject: [PATCH] Lazily init DBus only when it is needed OpenShift has some cAdvisor packages in its import chain. The init() here invokes Dbus start even when cAdvisor is not actively running or being used (in our packages). This change makes the systemd check and dbus initialization and connection lazy, occuring only the first time someone invokes UseSystemd(). --- container/docker/factory.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/container/docker/factory.go b/container/docker/factory.go index 58ff4388..1f5f7b8e 100644 --- a/container/docker/factory.go +++ b/container/docker/factory.go @@ -21,6 +21,7 @@ import ( "regexp" "strconv" "strings" + "sync" "github.com/docker/libcontainer/cgroups" "github.com/docker/libcontainer/cgroups/systemd" @@ -43,23 +44,23 @@ var dockerRootDir = flag.String("docker_root", "/var/lib/docker", "Absolute path // Whether the system is using Systemd. var useSystemd bool - -func init() { - useSystemd = systemd.UseSystemd() - if !useSystemd { - // Second attempt at checking for systemd, check for a "name=systemd" cgroup. - mnt, err := cgroups.FindCgroupMountpoint("cpu") - if err == nil { - // systemd presence does not mean systemd controls cgroups. - // If system.slice cgroup exists, then systemd is taking control. - // This breaks if user creates system.slice manually :) - useSystemd = utils.FileExists(mnt + "/system.slice") - } - } -} +var check = sync.Once{} func UseSystemd() bool { - // init would run and initialize useSystemd before we can call this method. + check.Do(func() { + // run and initialize useSystemd + useSystemd = systemd.UseSystemd() + if !useSystemd { + // Second attempt at checking for systemd, check for a "name=systemd" cgroup. + mnt, err := cgroups.FindCgroupMountpoint("cpu") + if err == nil { + // systemd presence does not mean systemd controls cgroups. + // If system.slice cgroup exists, then systemd is taking control. + // This breaks if user creates system.slice manually :) + useSystemd = utils.FileExists(mnt + "/system.slice") + } + } + }) return useSystemd } @@ -108,7 +109,7 @@ func ContainerNameToDockerId(name string) string { id := path.Base(name) // Turn systemd cgroup name into Docker ID. - if useSystemd { + if UseSystemd() { id = strings.TrimPrefix(id, "docker-") id = strings.TrimSuffix(id, ".scope") } @@ -119,7 +120,7 @@ func ContainerNameToDockerId(name string) string { // Returns a full container name for the specified Docker ID. func FullContainerName(dockerId string) string { // Add the full container name. - if useSystemd { + if UseSystemd() { return path.Join("/system.slice", fmt.Sprintf("docker-%s.scope", dockerId)) } else { return path.Join("/docker", dockerId) @@ -207,7 +208,7 @@ func Register(factory info.MachineInfoFactory, fsInfo fs.FsInfo) error { } } - if useSystemd { + if UseSystemd() { glog.Infof("System is using systemd") }