8210040: TestOptionsWithRanges.java is very slow
authoriklam
Tue, 28 Aug 2018 16:01:12 -0700
changeset 51558 a50648f7b1c8
parent 51557 0369fe9ae26f
child 51559 57f1bf06742e
8210040: TestOptionsWithRanges.java is very slow Summary: Added -Xmx1024m -XX:-ZapUnusedHeapArea; split into 10 smaller tests Reviewed-by: kvn, coleenp
test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java
test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges_generate.sh
test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java
--- a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java	Tue Aug 28 16:01:01 2018 -0700
+++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges.java	Tue Aug 28 16:01:12 2018 -0700
@@ -21,19 +21,122 @@
  * questions.
  */
 
+// --- start auto-generated
+// the following portion is auto-generated by TestOptionsWithRanges_generate.sh. Do not edit manually.
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (1 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 1 of 10
+ */
 /*
  * @test
  * @bug 8205633
- * @summary Test VM Options with ranges
+ * @summary Test VM Options with ranges (2 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 2 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (3 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 3 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (4 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 4 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (5 of 10)
  * @library /test/lib /runtime/CommandLine/OptionsValidation/common
  * @modules java.base/jdk.internal.misc
  *          java.management
  *          jdk.attach/sun.tools.attach
  *          jdk.internal.jvmstat/sun.jvmstat.monitor
- * @run main/othervm/timeout=1800 TestOptionsWithRanges
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 5 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (6 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 6 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (7 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 7 of 10
  */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (8 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 8 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (9 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 9 of 10
+ */
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges (10 of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges 10 of 10
+ */
+// --- end auto-generated
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import jdk.test.lib.Asserts;
@@ -72,9 +175,30 @@
         }
     }
 
+    // Return a subset of the test cases, so we can break up allOptionsAsMap into small parts
+    // and use them in separate JTREG @test blocks (for parallel execution).
+    //
+    // args[] must be {part, "of", numParts}. The first part should be "1".
+    private static List<JVMOption> getTestSubset(String[] args) throws Exception {
+        int part = Integer.parseInt(args[0]) - 1;
+        int numParts = Integer.parseInt(args[2]);
+        List<String> keys = new ArrayList<>(allOptionsAsMap.keySet());
+        Collections.sort(keys);
+        int numTests = keys.size();
+        int start = numTests * (part    ) / numParts;
+        int end   = numTests * (part + 1) / numParts;
+
+        List<JVMOption> subset = new ArrayList<>();
+        for (int i=start; i < end; i++) {
+            subset.add(allOptionsAsMap.get(keys.get(i)));
+        }
+        System.out.println("Generating subset [" + start + " ... " + end + ") of " +
+                           subset.size() + " tests out of " + keys.size() + " total tests");
+        return subset;
+    }
+
     public static void main(String[] args) throws Exception {
         int failedTests;
-        List<JVMOption> allOptions;
 
         allOptionsAsMap = JVMOptionsUtils.getOptionsWithRangeAsMap(origin -> (!(origin.contains("develop") || origin.contains("notproduct"))));
 
@@ -129,13 +253,13 @@
         excludeTestMaxRange("NonNMethodCodeHeapSize");
         excludeTestMaxRange("CodeCacheExpansionSize");
 
-        allOptions = new ArrayList<>(allOptionsAsMap.values());
+        List<JVMOption> testSubset = getTestSubset(args);
 
-        Asserts.assertGT(allOptions.size(), 0, "Options with ranges not found!");
+        Asserts.assertGT(testSubset.size(), 0, "Options with ranges not found!");
 
-        System.out.println("Parsed " + allOptions.size() + " options with ranges. Start test!");
+        System.out.println("Parsed " + testSubset.size() + " options with ranges. Start test!");
 
-        failedTests = JVMOptionsUtils.runCommandLineTests(allOptions);
+        failedTests = JVMOptionsUtils.runCommandLineTests(testSubset);
 
         Asserts.assertEQ(failedTests, 0,
                 String.format("%d tests failed! %s", failedTests, JVMOptionsUtils.getMessageWithFailures()));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/TestOptionsWithRanges_generate.sh	Tue Aug 28 16:01:12 2018 -0700
@@ -0,0 +1,42 @@
+# Copyright (c) 2018, 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.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+
+# Generate the @test tags inside TestOptionsWithRanges.java
+
+echo "// --- start auto-generated"
+echo "// the following portion is auto-generated by $0. Do not edit manually."
+
+for i in {1..10}; do 
+    cat <<EOF
+/*
+ * @test
+ * @bug 8205633
+ * @summary Test VM Options with ranges ($i of 10)
+ * @library /test/lib /runtime/CommandLine/OptionsValidation/common
+ * @modules java.base/jdk.internal.misc
+ *          java.management
+ *          jdk.attach/sun.tools.attach
+ *          jdk.internal.jvmstat/sun.jvmstat.monitor
+ * @run main/othervm/timeout=1800 TestOptionsWithRanges $i of 10
+ */
+EOF
+done
+echo "// --- end auto-generated"
--- a/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java	Tue Aug 28 16:01:01 2018 -0700
+++ b/test/hotspot/jtreg/runtime/CommandLine/OptionsValidation/common/optionsvalidation/JVMOption.java	Tue Aug 28 16:01:12 2018 -0700
@@ -34,6 +34,7 @@
 import jdk.test.lib.process.ProcessTools;
 import jdk.test.lib.dcmd.CommandExecutor;
 import jdk.test.lib.dcmd.JMXExecutor;
+import jdk.test.lib.Platform;
 import sun.tools.attach.HotSpotVirtualMachine;
 
 import static optionsvalidation.JVMOptionsUtils.failedMessage;
@@ -384,6 +385,17 @@
             runJava.add(VMType);
         }
 
+        // Run with a small heap to avoid excessive execution time
+        long max = Runtime.getRuntime().maxMemory() / 1024 / 1024;
+        if (max > 1024) {
+            runJava.add("-Xmx1024m");
+        }
+
+        if (Platform.isDebugBuild()) {
+            // Avoid excessive execution time.
+            runJava.add("-XX:-ZapUnusedHeapArea");
+        }
+
         if (GCType != null &&
             !(prepend.contains("-XX:+UseConcMarkSweepGC") ||
               prepend.contains("-XX:+UseSerialGC") ||