< prev index next >
src/java.base/linux/classes/jdk/internal/platform/cgroupv1/CgroupV1SubsystemController.java
Print this page
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
~
*** 1,7 ****
/*
! * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 23,52 ****
* questions.
*/
package jdk.internal.platform.cgroupv1;
! import java.io.BufferedReader;
! import java.io.IOException;
! import java.math.BigInteger;
! import java.nio.file.Files;
! import java.nio.file.Paths;
! import java.security.AccessController;
! import java.security.PrivilegedActionException;
! import java.security.PrivilegedExceptionAction;
! import java.util.ArrayList;
! import java.util.List;
! import java.util.Optional;
! import java.util.function.Function;
! import java.util.stream.Stream;
! public class SubSystem {
String root;
String mountPoint;
String path;
! public SubSystem(String root, String mountPoint) {
this.root = root;
this.mountPoint = mountPoint;
}
public void setPath(String cgroupPath) {
--- 23,45 ----
* questions.
*/
package jdk.internal.platform.cgroupv1;
! import jdk.internal.platform.CgroupSubsystem;
! import jdk.internal.platform.CgroupSubsystemController;
! public class CgroupV1SubsystemController implements CgroupSubsystemController {
!
! private static final double DOUBLE_RETVAL_UNLIMITED = CgroupSubsystem.LONG_RETVAL_UNLIMITED;
! // Values returned larger than this number are unlimited.
! static long UNLIMITED_MIN = 0x7FFFFFFFFF000000L;
String root;
String mountPoint;
String path;
! public CgroupV1SubsystemController(String root, String mountPoint) {
this.root = root;
this.mountPoint = mountPoint;
}
public void setPath(String cgroupPath) {
*** 73,283 ****
}
}
}
}
public String path() {
return path;
}
! /**
! * getSubSystemStringValue
! *
! * Return the first line of the file "parm" argument from the subsystem.
! *
! * TODO: Consider using weak references for caching BufferedReader object.
! *
! * @param subsystem
! * @param parm
! * @return Returns the contents of the file specified by param.
! */
! public static String getStringValue(SubSystem subsystem, String parm) {
! if (subsystem == null) return null;
!
! try {
! return subsystem.readStringValue(parm);
! } catch (IOException e) {
! return null;
! }
! }
!
! private String readStringValue(String param) throws IOException {
! PrivilegedExceptionAction<BufferedReader> pea = () ->
! Files.newBufferedReader(Paths.get(path(), param));
! try (BufferedReader bufferedReader =
! AccessController.doPrivileged(pea)) {
! String line = bufferedReader.readLine();
! return line;
! } catch (PrivilegedActionException e) {
! Metrics.unwrapIOExceptionAndRethrow(e);
! throw new InternalError(e.getCause());
! }
}
! public static long getLongValueMatchingLine(SubSystem subsystem,
! String param,
! String match,
! Function<String, Long> conversion) {
! long retval = Metrics.unlimited_minimum + 1; // default unlimited
! try {
! List<String> lines = subsystem.readMatchingLines(param);
! for (String line : lines) {
! if (line.startsWith(match)) {
! retval = conversion.apply(line);
! break;
! }
! }
! } catch (IOException e) {
! // Ignore. Default is unlimited.
! }
! return retval;
! }
!
! private List<String> readMatchingLines(String param) throws IOException {
! try {
! PrivilegedExceptionAction<List<String>> pea = () ->
! Files.readAllLines(Paths.get(path(), param));
! return AccessController.doPrivileged(pea);
! } catch (PrivilegedActionException e) {
! Metrics.unwrapIOExceptionAndRethrow(e);
! throw new InternalError(e.getCause());
! }
! }
!
! public static long getLongValue(SubSystem subsystem, String parm) {
! String strval = getStringValue(subsystem, parm);
! return convertStringToLong(strval);
}
public static long convertStringToLong(String strval) {
! long retval = 0;
! if (strval == null) return 0L;
!
! try {
! retval = Long.parseLong(strval);
! } catch (NumberFormatException e) {
! // For some properties (e.g. memory.limit_in_bytes) we may overflow the range of signed long.
! // In this case, return Long.MAX_VALUE
! BigInteger b = new BigInteger(strval);
! if (b.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) > 0) {
! return Long.MAX_VALUE;
! }
! }
! return retval;
! }
!
! public static double getDoubleValue(SubSystem subsystem, String parm) {
! String strval = getStringValue(subsystem, parm);
!
! if (strval == null) return 0L;
!
! double retval = Double.parseDouble(strval);
!
! return retval;
! }
!
! /**
! * getSubSystemlongEntry
! *
! * Return the long value from the line containing the string "entryname"
! * within file "parm" in the "subsystem".
! *
! * TODO: Consider using weak references for caching BufferedReader object.
! *
! * @param subsystem
! * @param parm
! * @param entryname
! * @return long value
! */
! public static long getLongEntry(SubSystem subsystem, String parm, String entryname) {
! String val = null;
!
! if (subsystem == null) return 0L;
!
! try (Stream<String> lines = Metrics.readFilePrivileged(Paths.get(subsystem.path(), parm))) {
!
! Optional<String> result = lines.map(line -> line.split(" "))
! .filter(line -> (line.length == 2 &&
! line[0].equals(entryname)))
! .map(line -> line[1])
! .findFirst();
!
! return result.isPresent() ? Long.parseLong(result.get()) : 0L;
! }
! catch (IOException e) {
! return 0L;
! }
}
! public static int getIntValue(SubSystem subsystem, String parm) {
! String val = getStringValue(subsystem, parm);
!
! if (val == null) return 0;
!
! return Integer.parseInt(val);
}
! /**
! * StringRangeToIntArray
! *
! * Convert a string in the form of 1,3-4,6 to an array of
! * integers containing all the numbers in the range.
! *
! * @param range
! * @return int[] containing a sorted list of processors or memory nodes
! */
! public static int[] StringRangeToIntArray(String range) {
! int[] ints = new int[0];
!
! if (range == null) return ints;
!
! ArrayList<Integer> results = new ArrayList<>();
! String strs[] = range.split(",");
! for (String str : strs) {
! if (str.contains("-")) {
! String lohi[] = str.split("-");
! // validate format
! if (lohi.length != 2) {
! continue;
! }
! int lo = Integer.parseInt(lohi[0]);
! int hi = Integer.parseInt(lohi[1]);
! for (int i = lo; i <= hi; i++) {
! results.add(i);
! }
! }
! else {
! results.add(Integer.parseInt(str));
! }
! }
!
! // sort results
! results.sort(null);
!
! // convert ArrayList to primitive int array
! ints = new int[results.size()];
! int i = 0;
! for (Integer n : results) {
! ints[i++] = n;
! }
!
! return ints;
! }
!
! public static class MemorySubSystem extends SubSystem {
!
! private boolean hierarchical;
!
! public MemorySubSystem(String root, String mountPoint) {
! super(root, mountPoint);
}
! boolean isHierarchical() {
! return hierarchical;
}
!
! void setHierarchical(boolean hierarchical) {
! this.hierarchical = hierarchical;
}
- }
}
--- 66,118 ----
}
}
}
}
+ @Override
public String path() {
return path;
}
! public static long getLongEntry(CgroupSubsystemController controller, String param, String entryname) {
! return CgroupSubsystemController.getLongEntry(controller,
! param,
! entryname,
! CgroupSubsystem.LONG_RETVAL_UNLIMITED /* retval on error */);
}
! public static double getDoubleValue(CgroupSubsystemController controller, String parm) {
! return CgroupSubsystemController.getDoubleValue(controller,
! parm,
! DOUBLE_RETVAL_UNLIMITED /* retval on error */);
}
public static long convertStringToLong(String strval) {
! return CgroupSubsystemController.convertStringToLong(strval,
! Long.MAX_VALUE /* overflow value */,
! CgroupSubsystem.LONG_RETVAL_UNLIMITED /* retval on error */);
}
! public static long longValOrUnlimited(long value) {
! return value > UNLIMITED_MIN ? CgroupSubsystem.LONG_RETVAL_UNLIMITED : value;
}
! public static long getLongValueMatchingLine(CgroupSubsystemController controller,
! String param,
! String match) {
! return CgroupSubsystemController.getLongValueMatchingLine(controller,
! param,
! match,
! CgroupV1SubsystemController::convertHierachicalLimitLine,
! CgroupSubsystem.LONG_RETVAL_UNLIMITED);
}
! public static long convertHierachicalLimitLine(String line) {
! String[] tokens = line.split("\\s");
! if (tokens.length == 2) {
! String strVal = tokens[1];
! return CgroupV1SubsystemController.convertStringToLong(strVal);
}
! return CgroupV1SubsystemController.UNLIMITED_MIN + 1; // unlimited
}
}
< prev index next >