< 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 >