From f0f261a899acf3c11d01c97e2503ec0ddb200232 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Fri, 17 Jul 2015 15:05:12 -0700 Subject: [PATCH] Update libcontainer to v0.0.2 This is fix for proper setup of nested containers cgroups. Signed-off-by: Alexander Morozov --- hack/vendor.sh | 2 +- .../runc/libcontainer/cgroups/fs/apply_raw.go | 12 ++++++---- .../runc/libcontainer/cgroups/utils.go | 22 +++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/hack/vendor.sh b/hack/vendor.sh index 3d189005a5..fb81c0586c 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -36,7 +36,7 @@ clone git github.com/hashicorp/consul v0.5.2 # get distribution packages clone git github.com/docker/distribution 419bbc2da637d9b2a812be78ef8436df7caac70d -clone git github.com/opencontainers/runc v0.0.1 # libcontainer +clone git github.com/opencontainers/runc v0.0.2 # libcontainer # libcontainer deps (see src/github.com/docker/libcontainer/update-vendor.sh) clone git github.com/coreos/go-systemd v2 clone git github.com/godbus/dbus v2 diff --git a/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go b/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go index 3d099d869c..1954357b6c 100644 --- a/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go +++ b/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go @@ -235,16 +235,20 @@ func getCgroupData(c *configs.Cgroup, pid int) (*data, error) { }, nil } -func (raw *data) parent(subsystem, mountpoint string) (string, error) { +func (raw *data) parent(subsystem, mountpoint, src string) (string, error) { initPath, err := cgroups.GetInitCgroupDir(subsystem) if err != nil { return "", err } - return filepath.Join(mountpoint, initPath), nil + relDir, err := filepath.Rel(src, initPath) + if err != nil { + return "", err + } + return filepath.Join(mountpoint, relDir), nil } func (raw *data) path(subsystem string) (string, error) { - mnt, err := cgroups.FindCgroupMountpoint(subsystem) + mnt, src, err := cgroups.FindCgroupMountpointAndSource(subsystem) // If we didn't mount the subsystem, there is no point we make the path. if err != nil { return "", err @@ -255,7 +259,7 @@ func (raw *data) path(subsystem string) (string, error) { return filepath.Join(raw.root, subsystem, raw.cgroup), nil } - parent, err := raw.parent(subsystem, mnt) + parent, err := raw.parent(subsystem, mnt, src) if err != nil { return "", err } diff --git a/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/utils.go b/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/utils.go index f58e717fb6..92438a07f7 100644 --- a/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/utils.go +++ b/vendor/src/github.com/opencontainers/runc/libcontainer/cgroups/utils.go @@ -42,6 +42,28 @@ func FindCgroupMountpoint(subsystem string) (string, error) { return "", NewNotFoundError(subsystem) } +func FindCgroupMountpointAndSource(subsystem string) (string, string, error) { + f, err := os.Open("/proc/self/mountinfo") + if err != nil { + return "", "", err + } + scanner := bufio.NewScanner(f) + for scanner.Scan() { + txt := scanner.Text() + fields := strings.Split(txt, " ") + for _, opt := range strings.Split(fields[len(fields)-1], ",") { + if opt == subsystem { + return fields[4], fields[3], nil + } + } + } + if err := scanner.Err(); err != nil { + return "", "", err + } + + return "", "", NewNotFoundError(subsystem) +} + func FindCgroupMountpointDir() (string, error) { mounts, err := mount.GetMounts() if err != nil {