Skip to content

Commit 42fc158

Browse files
committed
8253939: [TESTBUG] Increase coverage of the cgroups detection code
Reviewed-by: shade, bobv
1 parent 01eb690 commit 42fc158

File tree

2 files changed

+147
-13
lines changed

2 files changed

+147
-13
lines changed

test/hotspot/jtreg/containers/cgroup/CgroupSubsystemFactory.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public class CgroupSubsystemFactory {
5353
private static final int INVALID_CGROUPS_V1 = 4;
5454
private static final int INVALID_CGROUPS_NO_MOUNT = 5;
5555
private Path existingDirectory;
56+
private Path cgroupv1CgroupsJoinControllers;
57+
private Path cgroupv1SelfCgroupsJoinControllers;
58+
private Path cgroupv1MountInfoJoinControllers;
5659
private Path cgroupv1CgInfoZeroHierarchy;
5760
private Path cgroupv1MntInfoZeroHierarchy;
5861
private Path cgroupv2CgInfoZeroHierarchy;
@@ -81,6 +84,17 @@ public class CgroupSubsystemFactory {
8184
"1:name=systemd:/user.slice/user-15263.slice/user@15263.service/gnome-terminal-server.service\n" +
8285
"0::/user.slice/user-15263.slice/user@15263.service/gnome-terminal-server.service";
8386
private String procSelfCgroupV2UnifiedContent = "0::/user.slice/user-1000.slice/session-3.scope";
87+
private String procSelfCgroupV1JoinControllers =
88+
"9:freezer:/\n" +
89+
"8:rdma:/\n" +
90+
"7:blkio:/user.slice\n" +
91+
"6:devices:/user.slice\n" +
92+
"5:pids:/user.slice/user-1000.slice/session-2.scope\n" +
93+
"4:cpu,cpuacct,memory,net_cls,net_prio,hugetlb:/user.slice/user-1000.slice/session-2.scope\n" +
94+
"3:cpuset:/\n" +
95+
"2:perf_event:/\n" +
96+
"1:name=systemd:/user.slice/user-1000.slice/session-2.scope\n" +
97+
"0::/user.slice/user-1000.slice/session-2.scope\n";
8498
private String cgroupsZeroHierarchy =
8599
"#subsys_name hierarchy num_cgroups enabled\n" +
86100
"cpuset 0 1 1\n" +
@@ -92,6 +106,21 @@ public class CgroupSubsystemFactory {
92106
"net_cls 0 1 1\n" +
93107
"blkio 0 1 1\n" +
94108
"perf_event 0 1 1 ";
109+
private String cgroupsNonZeroJoinControllers =
110+
"#subsys_name hierarchy num_cgroups enabled\n" +
111+
"cpuset\t3\t1\t1\n" +
112+
"cpu\t4\t153\t1\n" +
113+
"cpuacct\t4\t153\t1\n" +
114+
"blkio\t7\t87\t1\n" +
115+
"memory\t4\t153\t1\n" +
116+
"devices\t6\t87\t1\n" +
117+
"freezer\t9\t1\t1\n" +
118+
"net_cls\t4\t153\t1\n" +
119+
"perf_event\t2\t1\t1\n" +
120+
"net_prio\t4\t153\t1\n" +
121+
"hugetlb\t4\t153\t1\n" +
122+
"pids\t5\t95\t1\n" +
123+
"rdma\t8\t1\t1\n";
95124
private String cgroupV2LineHybrid = "31 30 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:5 - cgroup2 none rw,seclabel,nsdelegate\n";
96125
private String cgroupv1MountInfoLineMemory = "35 30 0:31 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:7 - cgroup none rw,seclabel,memory\n";
97126
private String mntInfoHybridStub =
@@ -110,6 +139,18 @@ public class CgroupSubsystemFactory {
110139
private String mntInfoHybridMissingMemory = mntInfoHybridStub;
111140
private String mntInfoHybrid = cgroupV2LineHybrid + mntInfoHybridRest;
112141
private String mntInfoHybridFlippedOrder = mntInfoHybridRest + cgroupV2LineHybrid;
142+
private String mntInfoCgroupv1JoinControllers =
143+
"31 22 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:9 - tmpfs tmpfs ro,mode=755\n" +
144+
"32 31 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:10 - cgroup2 cgroup2 rw,nsdelegate\n" +
145+
"33 31 0:28 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,xattr,name=systemd\n" +
146+
"36 31 0:31 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,perf_event\n" +
147+
"37 31 0:32 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,cpuset\n" +
148+
"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" +
149+
"39 31 0:34 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,pids\n" +
150+
"40 31 0:35 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,devices\n" +
151+
"41 31 0:36 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:20 - cgroup cgroup rw,blkio\n" +
152+
"42 31 0:37 / /sys/fs/cgroup/rdma rw,nosuid,nodev,noexec,relatime shared:21 - cgroup cgroup rw,rdma\n" +
153+
"43 31 0:38 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:22 - cgroup cgroup rw,freezer\n";
113154
private String mntInfoCgroupv1MoreCpusetLine = "121 32 0:37 / /cpusets rw,relatime shared:69 - cgroup none rw,cpuset\n";
114155
private String mntInfoCgroupv1DoubleCpuset = mntInfoCgroupv1MoreCpusetLine + mntInfoHybrid;
115156
private String mntInfoCgroupv1DoubleCpuset2 = mntInfoHybrid + mntInfoCgroupv1MoreCpusetLine;
@@ -175,6 +216,15 @@ private void setup() {
175216

176217
cgroupv1MntInfoSystemdOnly = Paths.get(existingDirectory.toString(), "mnt_info_cgroupv1_systemd_only");
177218
Files.writeString(cgroupv1MntInfoSystemdOnly, mntInfoCgroupsV1SystemdOnly);
219+
220+
cgroupv1CgroupsJoinControllers = Paths.get(existingDirectory.toString(), "cgroups_cgv1_join_controllers");
221+
Files.writeString(cgroupv1CgroupsJoinControllers, cgroupsNonZeroJoinControllers);
222+
223+
cgroupv1SelfCgroupsJoinControllers = Paths.get(existingDirectory.toString(), "self_cgroup_cgv1_join_controllers");
224+
Files.writeString(cgroupv1SelfCgroupsJoinControllers, procSelfCgroupV1JoinControllers);
225+
226+
cgroupv1MountInfoJoinControllers = Paths.get(existingDirectory.toString(), "mntinfo_cgv1_join_controllers");
227+
Files.writeString(cgroupv1MountInfoJoinControllers, mntInfoCgroupv1JoinControllers);
178228
} catch (IOException e) {
179229
throw new RuntimeException(e);
180230
}
@@ -192,6 +242,16 @@ private boolean isValidCgroup(int value) {
192242
return value == CGROUPS_V1 || value == CGROUPS_V2;
193243
}
194244

245+
public void testCgroupv1JoinControllerCombo(WhiteBox wb) {
246+
String procCgroups = cgroupv1CgroupsJoinControllers.toString();
247+
String procSelfCgroup = cgroupv1SelfCgroupsJoinControllers.toString();
248+
String procSelfMountinfo = cgroupv1MountInfoJoinControllers.toString();
249+
int retval = wb.validateCgroup(procCgroups, procSelfCgroup, procSelfMountinfo);
250+
Asserts.assertEQ(CGROUPS_V1, retval, "Join controllers should be properly detected");
251+
Asserts.assertTrue(isValidCgroup(retval));
252+
System.out.println("testCgroupv1JoinControllerMounts PASSED!");
253+
}
254+
195255
public void testCgroupv1MultipleCpusetMounts(WhiteBox wb, Path mountInfo) {
196256
String procCgroups = cgroupv1CgInfoNonZeroHierarchy.toString();
197257
String procSelfCgroup = cgroupV1SelfCgroup.toString();
@@ -287,6 +347,7 @@ public static void main(String[] args) throws Exception {
287347
test.testCgroupv2NoCgroup2Fs(wb);
288348
test.testCgroupv1MultipleCpusetMounts(wb, test.cgroupv1MntInfoDoubleCpuset);
289349
test.testCgroupv1MultipleCpusetMounts(wb, test.cgroupv1MntInfoDoubleCpuset2);
350+
test.testCgroupv1JoinControllerCombo(wb);
290351
} finally {
291352
test.teardown();
292353
}

test/jdk/jdk/internal/platform/cgroup/TestCgroupSubsystemFactory.java

Lines changed: 86 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,33 @@
5050
public 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\t3\t1\t1\n" +
68+
"cpu\t4\t153\t1\n" +
69+
"cpuacct\t4\t153\t1\n" +
70+
"blkio\t7\t87\t1\n" +
71+
"memory\t4\t153\t1\n" +
72+
"devices\t6\t87\t1\n" +
73+
"freezer\t9\t1\t1\n" +
74+
"net_cls\t4\t153\t1\n" +
75+
"perf_event\t2\t1\t1\n" +
76+
"net_prio\t4\t153\t1\n" +
77+
"hugetlb\t4\t153\t1\n" +
78+
"pids\t5\t95\t1\n" +
79+
"rdma\t8\t1\t1\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.writeString(cgroupv1MntInfoSystemdOnly, mntInfoCgroupsV1SystemdOnly);
162+
163+
cgroupv1MntInfoDoubleCpusets = Paths.get(existingDirectory.toString(), "mountinfo_cgroupv1_double_cpuset");
164+
Files.writeString(cgroupv1MntInfoDoubleCpusets, mntInfoCgroupsV1DoubleCpuset);
165+
166+
cgroupv1MntInfoDoubleCpusets2 = Paths.get(existingDirectory.toString(), "mountinfo_cgroupv1_double_cpuset2");
167+
Files.writeString(cgroupv1MntInfoDoubleCpusets2, mntInfoCgroupsV1DoubleCpuset2);
168+
169+
cgroupv1CgroupsJoinControllers = Paths.get(existingDirectory.toString(), "cgroups_cgv1_join_controllers");
170+
Files.writeString(cgroupv1CgroupsJoinControllers, cgroupsNonZeroJoinControllers);
171+
172+
cgroupv1MountInfoJoinControllers = Paths.get(existingDirectory.toString(), "mntinfo_cgv1_join_controllers");
173+
Files.writeString(cgroupv1MountInfoJoinControllers, mntInfoCgroupv1JoinControllers);
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", result.isEmpty());
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

Comments
 (0)