50
50
public class TestCgroupSubsystemFactory {
51
51
52
52
private Path existingDirectory ;
53
+ private Path cgroupv1CgroupsJoinControllers ;
54
+ private Path cgroupv1MountInfoJoinControllers ;
53
55
private Path cgroupv1CgInfoZeroHierarchy ;
54
56
private Path cgroupv1MntInfoZeroHierarchy ;
55
57
private Path cgroupv2CgInfoZeroHierarchy ;
56
58
private Path cgroupv2MntInfoZeroHierarchy ;
57
59
private Path cgroupv1CgInfoNonZeroHierarchy ;
58
60
private Path cgroupv1MntInfoNonZeroHierarchy ;
59
61
private Path cgroupv1MntInfoSystemdOnly ;
62
+ private Path cgroupv1MntInfoDoubleCpusets ;
63
+ private Path cgroupv1MntInfoDoubleCpusets2 ;
60
64
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 " ;
61
80
private String cgroupsZeroHierarchy =
62
81
"#subsys_name hierarchy num_cgroups enabled\n " +
63
82
"cpuset 0 1 1\n " +
@@ -71,18 +90,30 @@ public class TestCgroupSubsystemFactory {
71
90
"perf_event 0 1 1 " ;
72
91
private String mntInfoHybrid =
73
92
"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 " ;
86
117
private String cgroupsNonZeroHierarchy =
87
118
"#subsys_name hierarchy num_cgroups enabled\n " +
88
119
"cpuset 9 1 1\n " +
@@ -98,10 +129,13 @@ public class TestCgroupSubsystemFactory {
98
129
"hugetlb 6 1 1\n " +
99
130
"pids 3 80 1" ;
100
131
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" ;
102
133
private String mntInfoCgroupsV1SystemdOnly =
103
134
"35 26 0:26 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime - cgroup systemd rw,name=systemd\n " +
104
135
"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 ;
105
139
106
140
@ Before
107
141
public void setup () {
@@ -125,6 +159,18 @@ public void setup() {
125
159
126
160
cgroupv1MntInfoSystemdOnly = Paths .get (existingDirectory .toString (), "mountinfo_cgroupv1_systemd_only" );
127
161
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 );
128
174
} catch (IOException e ) {
129
175
throw new RuntimeException (e );
130
176
}
@@ -139,6 +185,17 @@ public void teardown() {
139
185
}
140
186
}
141
187
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
+
142
199
@ Test
143
200
public void testCgroupv1SystemdOnly () throws IOException {
144
201
String cgroups = cgroupv1CgInfoZeroHierarchy .toString ();
@@ -148,6 +205,22 @@ public void testCgroupv1SystemdOnly() throws IOException {
148
205
assertTrue ("zero hierarchy ids with no *relevant* controllers mounted" , result .isEmpty ());
149
206
}
150
207
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
+
151
224
@ Test
152
225
public void testHybridCgroupsV1 () throws IOException {
153
226
String cgroups = cgroupv1CgInfoNonZeroHierarchy .toString ();
0 commit comments