5050public class TestCgroupSubsystemFactory {
5151
5252 private Path existingDirectory ;
53+ private Path cgroupv1CgroupsJoinControllers ;
54+ private Path cgroupv1MountInfoJoinControllers ;
5355 private Path cgroupv1CgInfoZeroHierarchy ;
5456 private Path cgroupv1MntInfoZeroHierarchy ;
5557 private Path cgroupv2CgInfoZeroHierarchy ;
5658 private Path cgroupv2MntInfoZeroHierarchy ;
5759 private Path cgroupv1CgInfoNonZeroHierarchy ;
5860 private Path cgroupv1MntInfoNonZeroHierarchy ;
5961 private Path cgroupv1MntInfoSystemdOnly ;
62+ private Path cgroupv1MntInfoDoubleCpusets ;
63+ private Path cgroupv1MntInfoDoubleCpusets2 ;
6064 private String mntInfoEmpty = "" ;
65+ private String cgroupsNonZeroJoinControllers =
66+ "#subsys_name hierarchy num_cgroups enabled\n " +
67+ "cpuset\t 3\t 1\t 1\n " +
68+ "cpu\t 4\t 153\t 1\n " +
69+ "cpuacct\t 4\t 153\t 1\n " +
70+ "blkio\t 7\t 87\t 1\n " +
71+ "memory\t 4\t 153\t 1\n " +
72+ "devices\t 6\t 87\t 1\n " +
73+ "freezer\t 9\t 1\t 1\n " +
74+ "net_cls\t 4\t 153\t 1\n " +
75+ "perf_event\t 2\t 1\t 1\n " +
76+ "net_prio\t 4\t 153\t 1\n " +
77+ "hugetlb\t 4\t 153\t 1\n " +
78+ "pids\t 5\t 95\t 1\n " +
79+ "rdma\t 8\t 1\t 1\n " ;
6180 private String cgroupsZeroHierarchy =
6281 "#subsys_name hierarchy num_cgroups enabled\n " +
6382 "cpuset 0 1 1\n " +
@@ -71,18 +90,30 @@ public class TestCgroupSubsystemFactory {
7190 "perf_event 0 1 1 " ;
7291 private String mntInfoHybrid =
7392 "30 23 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:4 - tmpfs tmpfs ro,seclabel,mode=755\n " +
74- "31 30 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:5 - cgroup2 cgroup2 rw,seclabel,nsdelegate\n " +
75- "32 30 0:28 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:6 - cgroup cgroup rw,seclabel,xattr,name=systemd\n " +
76- "35 30 0:31 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:7 - cgroup cgroup rw,seclabel,memory\n " +
77- "36 30 0:32 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:8 - cgroup cgroup rw,seclabel,pids\n " +
78- "37 30 0:33 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:9 - cgroup cgroup rw,seclabel,perf_event\n " +
79- "38 30 0:34 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,seclabel,net_cls,net_prio\n " +
80- "39 30 0:35 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,seclabel,hugetlb\n " +
81- "40 30 0:36 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,seclabel,cpu,cpuacct\n " +
82- "41 30 0:37 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,seclabel,devices\n " +
83- "42 30 0:38 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,seclabel,cpuset\n " +
84- "43 30 0:39 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,seclabel,blkio\n " +
85- "44 30 0:40 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,seclabel,freezer" ;
93+ "31 30 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:5 - cgroup2 none rw,seclabel,nsdelegate\n " +
94+ "32 30 0:28 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:6 - cgroup none rw,seclabel,xattr,name=systemd\n " +
95+ "35 30 0:31 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:7 - cgroup none rw,seclabel,memory\n " +
96+ "36 30 0:32 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:8 - cgroup none rw,seclabel,pids\n " +
97+ "37 30 0:33 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:9 - cgroup none rw,seclabel,perf_event\n " +
98+ "38 30 0:34 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:10 - cgroup none rw,seclabel,net_cls,net_prio\n " +
99+ "39 30 0:35 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:11 - cgroup none rw,seclabel,hugetlb\n " +
100+ "40 30 0:36 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:12 - cgroup none rw,seclabel,cpu,cpuacct\n " +
101+ "41 30 0:37 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:13 - cgroup none rw,seclabel,devices\n " +
102+ "42 30 0:38 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:14 - cgroup none rw,seclabel,cpuset\n " +
103+ "43 30 0:39 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:15 - cgroup none rw,seclabel,blkio\n " +
104+ "44 30 0:40 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup none rw,seclabel,freezer\n " ;
105+ private String mntInfoCgroupv1JoinControllers =
106+ "31 22 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:9 - tmpfs tmpfs ro,mode=755\n " +
107+ "32 31 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:10 - cgroup2 cgroup2 rw,nsdelegate\n " +
108+ "33 31 0:28 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,xattr,name=systemd\n " +
109+ "36 31 0:31 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,perf_event\n " +
110+ "37 31 0:32 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,cpuset\n " +
111+ "38 31 0:33 / /sys/fs/cgroup/cpu,cpuacct,net_cls,net_prio,hugetlb,memory rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,cpu,cpuacct,memory,net_cls,net_prio,hugetlb\n " +
112+ "39 31 0:34 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,pids\n " +
113+ "40 31 0:35 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,devices\n " +
114+ "41 31 0:36 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:20 - cgroup cgroup rw,blkio\n " +
115+ "42 31 0:37 / /sys/fs/cgroup/rdma rw,nosuid,nodev,noexec,relatime shared:21 - cgroup cgroup rw,rdma\n " +
116+ "43 31 0:38 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:22 - cgroup cgroup rw,freezer\n " ;
86117 private String cgroupsNonZeroHierarchy =
87118 "#subsys_name hierarchy num_cgroups enabled\n " +
88119 "cpuset 9 1 1\n " +
@@ -98,10 +129,13 @@ public class TestCgroupSubsystemFactory {
98129 "hugetlb 6 1 1\n " +
99130 "pids 3 80 1" ;
100131 private String mntInfoCgroupsV2Only =
101- "28 21 0:25 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:4 - cgroup2 cgroup2 rw,seclabel,nsdelegate" ;
132+ "28 21 0:25 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:4 - cgroup2 none rw,seclabel,nsdelegate" ;
102133 private String mntInfoCgroupsV1SystemdOnly =
103134 "35 26 0:26 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup systemd rw,name=systemd\n " +
104135 "26 18 0:19 / /sys/fs/cgroup rw,relatime - tmpfs none rw,size=4k,mode=755\n " ;
136+ private String mntInfoCgroupv1MoreCpusetLine = "121 32 0:37 / /cpuset rw,relatime shared:69 - cgroup none rw,cpuset\n " ;
137+ private String mntInfoCgroupsV1DoubleCpuset = mntInfoHybrid + mntInfoCgroupv1MoreCpusetLine ;
138+ private String mntInfoCgroupsV1DoubleCpuset2 = mntInfoCgroupv1MoreCpusetLine + mntInfoHybrid ;
105139
106140 @ Before
107141 public void setup () {
@@ -125,6 +159,18 @@ public void setup() {
125159
126160 cgroupv1MntInfoSystemdOnly = Paths .get (existingDirectory .toString (), "mountinfo_cgroupv1_systemd_only" );
127161 Files .write (cgroupv1MntInfoSystemdOnly , mntInfoCgroupsV1SystemdOnly .getBytes ());
162+
163+ cgroupv1MntInfoDoubleCpusets = Paths .get (existingDirectory .toString (), "mountinfo_cgroupv1_double_cpuset" );
164+ Files .write (cgroupv1MntInfoDoubleCpusets , mntInfoCgroupsV1DoubleCpuset .getBytes ());
165+
166+ cgroupv1MntInfoDoubleCpusets2 = Paths .get (existingDirectory .toString (), "mountinfo_cgroupv1_double_cpuset2" );
167+ Files .write (cgroupv1MntInfoDoubleCpusets2 , mntInfoCgroupsV1DoubleCpuset2 .getBytes ());
168+
169+ cgroupv1CgroupsJoinControllers = Paths .get (existingDirectory .toString (), "cgroups_cgv1_join_controllers" );
170+ Files .write (cgroupv1CgroupsJoinControllers , cgroupsNonZeroJoinControllers .getBytes ());
171+
172+ cgroupv1MountInfoJoinControllers = Paths .get (existingDirectory .toString (), "mntinfo_cgv1_join_controllers" );
173+ Files .write (cgroupv1MountInfoJoinControllers , mntInfoCgroupv1JoinControllers .getBytes ());
128174 } catch (IOException e ) {
129175 throw new RuntimeException (e );
130176 }
@@ -139,6 +185,17 @@ public void teardown() {
139185 }
140186 }
141187
188+ @ Test
189+ public void testCgroupv1JoinControllerCombo () throws IOException {
190+ String cgroups = cgroupv1CgroupsJoinControllers .toString ();
191+ String mountInfo = cgroupv1MountInfoJoinControllers .toString ();
192+ Optional <CgroupTypeResult > result = CgroupSubsystemFactory .determineType (mountInfo , cgroups );
193+
194+ assertTrue ("Expected non-empty cgroup result" , result .isPresent ());
195+ CgroupTypeResult res = result .get ();
196+ assertFalse ("Join controller combination expected as cgroups v1" , res .isCgroupV2 ());
197+ }
198+
142199 @ Test
143200 public void testCgroupv1SystemdOnly () throws IOException {
144201 String cgroups = cgroupv1CgInfoZeroHierarchy .toString ();
@@ -148,6 +205,22 @@ public void testCgroupv1SystemdOnly() throws IOException {
148205 assertTrue ("zero hierarchy ids with no *relevant* controllers mounted" , Optional .empty ().equals (result ));
149206 }
150207
208+ @ Test
209+ public void testCgroupv1MultipleCpusetMounts () throws IOException {
210+ doMultipleCpusetMountsTest (cgroupv1MntInfoDoubleCpusets );
211+ doMultipleCpusetMountsTest (cgroupv1MntInfoDoubleCpusets2 );
212+ }
213+
214+ private void doMultipleCpusetMountsTest (Path info ) throws IOException {
215+ String cgroups = cgroupv1CgInfoNonZeroHierarchy .toString ();
216+ String mountInfo = info .toString ();
217+ Optional <CgroupTypeResult > result = CgroupSubsystemFactory .determineType (mountInfo , cgroups );
218+
219+ assertTrue ("Expected non-empty cgroup result" , result .isPresent ());
220+ CgroupTypeResult res = result .get ();
221+ assertFalse ("Duplicate cpusets should not influence detection heuristic" , res .isCgroupV2 ());
222+ }
223+
151224 @ Test
152225 public void testHybridCgroupsV1 () throws IOException {
153226 String cgroups = cgroupv1CgInfoNonZeroHierarchy .toString ();
0 commit comments