Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ static CgroupMetrics create() {
} catch (IOException | UncheckedIOException e) {
return null;
}
return create(optResult);
}

public static CgroupMetrics create(Optional<CgroupTypeResult> optResult) {
if (optResult.isEmpty()) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
Expand All @@ -50,7 +51,7 @@

/*
* @test
* @bug 8287107
* @bug 8287107 8287073
* @key cgroups
* @requires os.family == "linux"
* @modules java.base/jdk.internal.platform
Expand All @@ -66,6 +67,7 @@ public class TestCgroupSubsystemFactory {
private Path cgroupv1CgInfoZeroHierarchy;
private Path cgroupv1MntInfoZeroHierarchy;
private Path cgroupv2CgInfoZeroHierarchy;
private Path cgroupv2CgInfoZeroMinimal;
private Path cgroupv2MntInfoZeroHierarchy;
private Path cgroupv1CgInfoNonZeroHierarchy;
private Path cgroupv1MntInfoNonZeroHierarchy;
Expand Down Expand Up @@ -127,6 +129,9 @@ public class TestCgroupSubsystemFactory {
"net_cls 0 1 1\n" +
"blkio 0 1 1\n" +
"perf_event 0 1 1 ";
private String cgroupsZeroHierarchyMinimal =
"#subsys_name hierarchy num_cgroups enabled\n" +
"cpu 0 1 1\n";
private String mntInfoHybrid =
"30 23 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec shared:4 - tmpfs tmpfs ro,seclabel,mode=755\n" +
"31 30 0:27 / /sys/fs/cgroup/unified rw,nosuid,nodev,noexec,relatime shared:5 - cgroup2 none rw,seclabel,nsdelegate\n" +
Expand Down Expand Up @@ -306,6 +311,9 @@ public void setup() {
cgroupv1MountInfoCgroupsOnlyCPUCtrl = Paths.get(existingDirectory.toString(), "self_mountinfo_cpu_only_controller");
Files.writeString(cgroupv1MountInfoCgroupsOnlyCPUCtrl, mntInfoCpuOnly);

cgroupv2CgInfoZeroMinimal = Paths.get(existingDirectory.toString(), "cgv2_proc_cgroups_minimal");
Files.writeString(cgroupv2CgInfoZeroMinimal, cgroupsZeroHierarchyMinimal);

cgroupv2CgInfoNoZeroHierarchyOnlyFreezer = Paths.get(existingDirectory.toString(), "cgroups_cgv2_non_zero_only_freezer");
Files.writeString(cgroupv2CgInfoNoZeroHierarchyOnlyFreezer, cgroupsNonZeroHierarchyOnlyFreezer);

Expand Down Expand Up @@ -480,6 +488,30 @@ public void testZeroHierarchyCgroupsV2() throws IOException {
assertEquals("/sys/fs/cgroup", cpuInfo.getMountPoint());
}

/*
* On some systems the memory controller might not show up in /proc/cgroups
* which may provoke a NPE on instantiation. See bug 8287073.
*/
@Test
public void testZeroHierarchyCgroupsV2Minimal() throws IOException {
String cgroups = cgroupv2CgInfoZeroMinimal.toString();
String mountInfo = cgroupv2MntInfoZeroHierarchy.toString();
String selfCgroup = cgroupv2SelfCgroup.toString();
Optional<CgroupTypeResult> result = CgroupSubsystemFactory.determineType(mountInfo, cgroups, selfCgroup);

assertTrue("Expected non-empty cgroup result", result.isPresent());
CgroupTypeResult res = result.get();

assertTrue("zero hierarchy ids with mounted controllers expected cgroups v2", res.isCgroupV2());
assertNull("Only cpu controller present", res.getInfos().get("memory"));
try {
CgroupSubsystemFactory.create(result);
// pass
} catch (NullPointerException e) {
fail("Missing memory controller should not cause any NPE");
}
}

@Test(expected = IOException.class)
public void mountInfoFileNotFound() throws IOException {
String cgroups = cgroupv1CgInfoZeroHierarchy.toString(); // any existing file
Expand Down