< prev index next >
src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java
Print this page
@ rev 57735 : Review feedback 2
|
o rev 57734 : Review feedback
|
o rev 57733 : 8231111: Cgroups v2: Rework Metrics in java.base so as to recognize unified hierarchy
| Reviewed-by: bobv, mchung
~
o rev 56862 : 8231111: Cgroups v2: Rework Metrics in java.base so as to recognize unified hierarchy
| Reviewed-by: bobv
~
@@ -25,39 +25,83 @@
package jdk.internal.platform.cgroupv2;
import java.io.IOException;
import java.nio.file.Paths;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import jdk.internal.platform.CgroupSubsystem;
import jdk.internal.platform.CgroupSubsystemController;
import jdk.internal.platform.CgroupUtil;
public class CgroupV2Subsystem implements CgroupSubsystem {
+ private static final CgroupV2Subsystem INSTANCE = initSubsystem();
private static final long[] LONG_ARRAY_NOT_SUPPORTED = null;
private static final int[] INT_ARRAY_UNAVAILABLE = null;
private final CgroupSubsystemController unified;
private static final String PROVIDER_NAME = "cgroupv2";
private static final int PER_CPU_SHARES = 1024;
private static final String MAX_VAL = "max";
private static final Object EMPTY_STR = "";
- public CgroupV2Subsystem(CgroupSubsystemController unified) {
+ private CgroupV2Subsystem(CgroupSubsystemController unified) {
this.unified = unified;
}
private long getLongVal(String file) {
return CgroupSubsystemController.getLongValue(unified,
file,
CgroupV2SubsystemController::convertStringToLong,
CgroupSubsystem.LONG_RETVAL_UNLIMITED);
}
+ private static CgroupV2Subsystem initSubsystem() {
+ // read mountinfo so as to determine root mount path
+ String mountPath = null;
+ try (Stream<String> lines =
+ CgroupUtil.readFilePrivileged(Paths.get("/proc/self/mountinfo"))) {
+
+ String l = lines.filter(line -> line.contains(" - cgroup2 "))
+ .collect(Collectors.joining());
+ String[] tokens = l.split(" ");
+ mountPath = tokens[4];
+ } catch (IOException e) {
+ return null;
+ }
+ String cgroupPath = null;
+ try {
+ List<String> lines = CgroupUtil.readAllLinesPrivileged(Paths.get("/proc/self/cgroup"));
+ for (String line: lines) {
+ String[] tokens = line.split(":");
+ if (tokens.length != 3) {
+ return null; // something is not right.
+ }
+ if (!"0".equals(tokens[0])) {
+ // hierarchy must be zero for cgroups v2
+ return null;
+ }
+ cgroupPath = tokens[2];
+ break;
+ }
+ } catch (IOException e) {
+ return null;
+ }
+ CgroupSubsystemController unified = new CgroupV2SubsystemController(
+ mountPath,
+ cgroupPath);
+ return new CgroupV2Subsystem(unified);
+ }
+
+ public static CgroupSubsystem getInstance() {
+ return INSTANCE;
+ }
+
@Override
public String getProvider() {
return PROVIDER_NAME;
}
< prev index next >