utils: takes the longest path on cgroup v1

now getCgroupProcess takes the longest path on cgroup v1, instead of
complaining if the paths are different.

This should help when --cgroups=split is used on cgroup v1 and the
process cgroups look like:

$ cat /proc/self/cgroup
11:pids:/user.slice/user-0.slice/session-4.scope
10:blkio:/
9:cpuset:/
8:devices:/user.slice
7:freezer:/
6:memory:/user.slice/user-0.slice/session-4.scope
5:net_cls,net_prio:/
4:hugetlb:/
3:cpu,cpuacct:/
2:perf_event:/

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano
2021-02-10 14:46:08 +01:00
parent 1b5f3ed24d
commit 660a06f2f7
3 changed files with 40 additions and 9 deletions

View File

@ -619,6 +619,13 @@ func SkipIfNotRootless(reason string) {
} }
} }
func SkipIfNotSystemd(manager, reason string) {
checkReason(reason)
if manager != "systemd" {
ginkgo.Skip("[notSystemd]: " + reason)
}
}
func SkipIfNotFedora() { func SkipIfNotFedora() {
info := GetHostDistributionInfo() info := GetHostDistributionInfo()
if info.Distribution != "fedora" { if info.Distribution != "fedora" {

View File

@ -1191,6 +1191,37 @@ USER mail`
Expect(found).To(BeTrue()) Expect(found).To(BeTrue())
}) })
It("podman run with cgroups=split", func() {
SkipIfNotSystemd(podmanTest.CgroupManager, "do not test --cgroups=split if not running on systemd")
SkipIfRootlessCgroupsV1("Disable cgroups not supported on cgroupv1 for rootless users")
SkipIfRemote("--cgroups=split cannot be used in remote mode")
container := podmanTest.Podman([]string{"run", "--rm", "--cgroups=split", ALPINE, "cat", "/proc/self/cgroup"})
container.WaitWithDefaultTimeout()
Expect(container.ExitCode()).To(Equal(0))
lines := container.OutputToStringArray()
cgroup := ""
for _, line := range lines {
parts := strings.SplitN(line, ":", 3)
if !CGROUPSV2 {
// ignore unified on cgroup v1
// both runc and crun do not set it.
if parts[1] == "" {
continue
}
}
if parts[2] == "/" {
continue
}
if cgroup == "" {
cgroup = parts[2]
continue
}
Expect(cgroup).To(Equal(parts[2]))
}
})
It("podman run with cgroups=disabled runs without cgroups", func() { It("podman run with cgroups=disabled runs without cgroups", func() {
SkipIfRootless("FIXME: I believe this should work but need to fix this test") SkipIfRootless("FIXME: I believe this should work but need to fix this test")
SkipIfRootlessCgroupsV1("Disable cgroups not supported on cgroupv1 for rootless users") SkipIfRootlessCgroupsV1("Disable cgroups not supported on cgroupv1 for rootless users")

View File

@ -81,16 +81,9 @@ func getCgroupProcess(procFile string) (string, error) {
cgroup = line[3:] cgroup = line[3:]
break break
} }
// root cgroup, skip it if len(parts[2]) > len(cgroup) {
if parts[2] == "/" { cgroup = parts[2]
continue
} }
// The process must have the same cgroup path for all controllers
// The OCI runtime spec file allow us to specify only one path.
if cgroup != "/" && cgroup != parts[2] {
return "", errors.Errorf("cgroup configuration not supported, the process is in two different cgroups")
}
cgroup = parts[2]
} }
if cgroup == "/" { if cgroup == "/" {
return "", errors.Errorf("could not find cgroup mount in %q", procFile) return "", errors.Errorf("could not find cgroup mount in %q", procFile)