< prev index next >

src/java.base/linux/classes/jdk/internal/platform/cgroupv2/CgroupV2Subsystem.java

Print this page
@  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
~

@@ -32,14 +32,15 @@
 import java.util.stream.Collectors;
 
 import jdk.internal.platform.CgroupSubsystem;
 import jdk.internal.platform.CgroupSubsystemController;
 import jdk.internal.platform.CgroupUtil;
-import jdk.internal.platform.Metrics;
 
 public class CgroupV2Subsystem implements CgroupSubsystem {
 
+    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 = "";

@@ -49,38 +50,48 @@
     }
 
     private long getLongVal(String file) {
         return CgroupSubsystemController.getLongValue(unified,
                                                       file,
-                                                      CgroupV2SubsystemController::convertStringToLong);
+                                                      CgroupV2SubsystemController::convertStringToLong,
+                                                      CgroupSubsystem.LONG_RETVAL_UNLIMITED);
     }
 
     @Override
     public String getProvider() {
         return PROVIDER_NAME;
     }
 
     @Override
     public long getCpuUsage() {
-        long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "usage_usec");
+        long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "usage_usec");
+        if (micros < 0) {
+            return micros;
+        }
         return TimeUnit.MICROSECONDS.toNanos(micros);
     }
 
     @Override
     public long[] getPerCpuUsage() {
-        return null; // Not supported.
+        return LONG_ARRAY_NOT_SUPPORTED;
     }
 
     @Override
     public long getCpuUserUsage() {
-        long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "user_usec");
+        long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "user_usec");
+        if (micros < 0) {
+            return micros;
+        }
         return TimeUnit.MICROSECONDS.toNanos(micros);
     }
 
     @Override
     public long getCpuSystemUsage() {
-        long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "system_usec");
+        long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "system_usec");
+        if (micros < 0) {
+            return micros;
+        }
         return TimeUnit.MICROSECONDS.toNanos(micros);
     }
 
     @Override
     public long getCpuPeriod() {

@@ -94,33 +105,33 @@
 
     private long getFromCpuMax(int tokenIdx) {
         String cpuMaxRaw = CgroupSubsystemController.getStringValue(unified, "cpu.max");
         if (cpuMaxRaw == null) {
             // likely file not found
-            return Metrics.LONG_RETVAL_UNLIMITED;
+            return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
         }
         // $MAX $PERIOD
         String[] tokens = cpuMaxRaw.split("\\s+");
         if (tokens.length != 2) {
-            return Metrics.LONG_RETVAL_UNLIMITED;
+            return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
         }
         String quota = tokens[tokenIdx];
         return limitFromString(quota);
     }
 
     private long limitFromString(String strVal) {
-        if (MAX_VAL.equals(strVal)) {
-            return Metrics.LONG_RETVAL_UNLIMITED;
+        if (strVal == null || MAX_VAL.equals(strVal)) {
+            return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
         }
         return Long.parseLong(strVal);
     }
 
     @Override
     public long getCpuShares() {
         long sharesRaw = getLongVal("cpu.weight");
-        if (sharesRaw == 100 || sharesRaw == 0) {
-            return Metrics.LONG_RETVAL_UNLIMITED;
+        if (sharesRaw == 100 || sharesRaw <= 0) {
+            return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
         }
         int shares = (int)sharesRaw;
         // CPU shares (OCI) value needs to get translated into
         // a proper Cgroups v2 value. See:
         // https://github.com/containers/crun/blob/master/crun.1.md#cpu-controller

@@ -143,21 +154,24 @@
         return x;
     }
 
     @Override
     public long getCpuNumPeriods() {
-        return CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "nr_periods");
+        return CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "nr_periods");
     }
 
     @Override
     public long getCpuNumThrottled() {
-        return CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "nr_throttled");
+        return CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "nr_throttled");
     }
 
     @Override
     public long getCpuThrottledTime() {
-        long micros = CgroupSubsystemController.getLongEntry(unified, "cpu.stat", "throttled_usec");
+        long micros = CgroupV2SubsystemController.getLongEntry(unified, "cpu.stat", "throttled_usec");
+        if (micros < 0) {
+            return micros;
+        }
         return TimeUnit.MICROSECONDS.toNanos(micros);
     }
 
     @Override
     public long getEffectiveCpuCount() {

@@ -165,133 +179,71 @@
     }
 
     @Override
     public int[] getCpuSetCpus() {
         String cpuSetVal = CgroupSubsystemController.getStringValue(unified, "cpuset.cpus");
-        if (cpuSetVal == null || EMPTY_STR.equals(cpuSetVal)) {
-            return null; // not available
-        }
-        return CgroupSubsystemController.stringRangeToIntArray(cpuSetVal);
+        return getCpuSet(cpuSetVal);
     }
 
     @Override
     public int[] getEffectiveCpuSetCpus() {
         String effCpuSetVal = CgroupSubsystemController.getStringValue(unified, "cpuset.cpus.effective");
-        if (effCpuSetVal == null || EMPTY_STR.equals(effCpuSetVal)) {
-            return null; // not available
-        }
-        return CgroupSubsystemController.stringRangeToIntArray(effCpuSetVal);
+        return getCpuSet(effCpuSetVal);
     }
 
     @Override
     public int[] getCpuSetMems() {
-        return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(unified, "cpuset.mems"));
+        String cpuSetMems = CgroupSubsystemController.getStringValue(unified, "cpuset.mems");
+        return getCpuSet(cpuSetMems);
     }
 
     @Override
     public int[] getEffectiveCpuSetMems() {
-        return CgroupSubsystemController.stringRangeToIntArray(CgroupSubsystemController.getStringValue(unified, "cpuset.mems.effective"));
+        String effCpuSetMems = CgroupSubsystemController.getStringValue(unified, "cpuset.mems.effective");
+        return getCpuSet(effCpuSetMems);
     }
 
-    @Override
-    public double getCpuSetMemoryPressure() {
-        return Metrics.DOUBLE_RETVAL_NOT_SUPPORTED;
+    private int[] getCpuSet(String cpuSetVal) {
+        if (cpuSetVal == null || EMPTY_STR.equals(cpuSetVal)) {
+            return INT_ARRAY_UNAVAILABLE;
     }
-
-    @Override
-    public Boolean isCpuSetMemoryPressureEnabled() {
-        return Metrics.BOOL_RETVAL_NOT_SUPPORTED;
+        return CgroupSubsystemController.stringRangeToIntArray(cpuSetVal);
     }
 
     @Override
     public long getMemoryFailCount() {
-        return CgroupSubsystemController.getLongEntry(unified, "memory.events", "max");
+        return CgroupV2SubsystemController.getLongEntry(unified, "memory.events", "max");
     }
 
     @Override
     public long getMemoryLimit() {
         String strVal = CgroupSubsystemController.getStringValue(unified, "memory.max");
         return limitFromString(strVal);
     }
 
     @Override
-    public long getMemoryMaxUsage() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
     public long getMemoryUsage() {
         return getLongVal("memory.current");
     }
 
     @Override
-    public long getKernelMemoryFailCount() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getKernelMemoryLimit() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getKernelMemoryMaxUsage() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getKernelMemoryUsage() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getTcpMemoryFailCount() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getTcpMemoryLimit() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
-    public long getTcpMemoryMaxUsage() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
     public long getTcpMemoryUsage() {
-        return CgroupSubsystemController.getLongEntry(unified, "memory.stat", "sock");
-    }
-
-    @Override
-    public long getMemoryAndSwapFailCount() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
+        return CgroupV2SubsystemController.getLongEntry(unified, "memory.stat", "sock");
     }
 
     @Override
     public long getMemoryAndSwapLimit() {
         String strVal = CgroupSubsystemController.getStringValue(unified, "memory.swap.max");
         return limitFromString(strVal);
     }
 
     @Override
-    public long getMemoryAndSwapMaxUsage() {
-        return Metrics.LONG_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
     public long getMemoryAndSwapUsage() {
         return getLongVal("memory.swap.current");
     }
 
     @Override
-    public Boolean isMemoryOOMKillEnabled() {
-        return Metrics.BOOL_RETVAL_NOT_SUPPORTED;
-    }
-
-    @Override
     public long getMemorySoftLimit() {
         String softLimitStr = CgroupSubsystemController.getStringValue(unified, "memory.high");
         return limitFromString(softLimitStr);
     }
 

@@ -310,11 +262,11 @@
         try {
             return CgroupUtil.readFilePrivileged(Paths.get(unified.path(), "io.stat"))
                                 .map(mapFunc)
                                 .collect(Collectors.summingLong(e -> e));
         } catch (IOException e) {
-            return Metrics.LONG_RETVAL_NOT_SUPPORTED;
+            return CgroupSubsystem.LONG_RETVAL_UNLIMITED;
         }
     }
 
     private static String[] getRWIOMatchTokenNames() {
         return new String[] { "rios", "wios" };
< prev index next >