--- a/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java Thu Oct 17 20:27:44 2019 +0100
+++ b/test/lib/jdk/test/lib/containers/cgroup/MetricsTester.java Thu Oct 17 20:53:35 2019 +0100
@@ -26,6 +26,7 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -157,7 +158,24 @@
private static long getLongValueFromFile(SubSystem subSystem, String fileName) {
String data = getFileContents(subSystem, fileName);
- return data.isEmpty() ? 0L : Long.parseLong(data);
+ return data.isEmpty() ? 0L : convertStringToLong(data);
+ }
+
+ private 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;
}
private static long getLongValueFromFile(SubSystem subSystem, String metric, String subMetric) {
@@ -165,7 +183,8 @@
String[] tokens = stats.split("[\\r\\n]+");
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].startsWith(subMetric)) {
- return Long.parseLong(tokens[i].split("\\s+")[1]);
+ String strval = tokens[i].split("\\s+")[1];
+ return convertStringToLong(strval);
}
}
return 0L;
@@ -531,16 +550,20 @@
long newUsage = metrics.getCpuUsage();
long[] newPerCpu = metrics.getPerCpuUsage();
- if (newSysVal <= startSysVal) {
+ // system/user CPU usage counters may be slowly increasing.
+ // allow for equal values for a pass
+ if (newSysVal < startSysVal) {
fail(SubSystem.CPU, "getCpuSystemUsage", newSysVal, startSysVal);
}
- if (newUserVal <= startUserVal) {
+ // system/user CPU usage counters may be slowly increasing.
+ // allow for equal values for a pass
+ if (newUserVal < startUserVal) {
fail(SubSystem.CPU, "getCpuUserUsage", newUserVal, startUserVal);
}
if (newUsage <= startUsage) {
- fail(SubSystem.CPU, "getCpuUserUsage", newUsage, startUsage);
+ fail(SubSystem.CPU, "getCpuUsage", newUsage, startUsage);
}
boolean success = false;
@@ -559,19 +582,28 @@
Metrics metrics = Metrics.systemMetrics();
long memoryMaxUsage = metrics.getMemoryMaxUsage();
long memoryUsage = metrics.getMemoryUsage();
-
- long[] ll = new long[64*1024*1024]; // 64M
+ long newMemoryMaxUsage = 0, newMemoryUsage = 0;
- long newMemoryMaxUsage = metrics.getMemoryMaxUsage();
- long newMemoryUsage = metrics.getMemoryUsage();
+ // allocate memory in a loop and check more than once for new values
+ // otherwise we might see seldom the effect of decreasing new memory values
+ // e.g. because the system could free up memory
+ byte[][] bytes = new byte[32][];
+ for (int i = 0; i < 32; i++) {
+ bytes[i] = new byte[8*1024*1024];
+ newMemoryUsage = metrics.getMemoryUsage();
+ if (newMemoryUsage > memoryUsage) {
+ break;
+ }
+ }
+ newMemoryMaxUsage = metrics.getMemoryMaxUsage();
- if(newMemoryMaxUsage < memoryMaxUsage) {
- fail(SubSystem.MEMORY, "getMemoryMaxUsage", newMemoryMaxUsage,
- memoryMaxUsage);
+ if (newMemoryMaxUsage < memoryMaxUsage) {
+ fail(SubSystem.MEMORY, "getMemoryMaxUsage", memoryMaxUsage,
+ newMemoryMaxUsage);
}
- if(newMemoryUsage < memoryUsage) {
- fail(SubSystem.MEMORY, "getMemoryUsage", newMemoryUsage, memoryUsage);
+ if (newMemoryUsage < memoryUsage) {
+ fail(SubSystem.MEMORY, "getMemoryUsage", memoryUsage, newMemoryUsage);
}
}