8202169: Reduce ctw_2 duration by parallelizing CtwRunner invocations
authormikael
Tue, 24 Apr 2018 21:40:10 -0700
changeset 49881 29419b836244
parent 49880 3714eeb7e473
child 49882 a02abc7e5536
8202169: Reduce ctw_2 duration by parallelizing CtwRunner invocations Reviewed-by: kvn, iignatyev
test/hotspot/jtreg/TEST.groups
test/hotspot/jtreg/applications/ctw/modules/java_base.java
test/hotspot/jtreg/applications/ctw/modules/java_base_2.java
test/hotspot/jtreg/applications/ctw/modules/java_desktop.java
test/hotspot/jtreg/applications/ctw/modules/java_desktop_2.java
test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java
--- a/test/hotspot/jtreg/TEST.groups	Tue Apr 24 20:25:48 2018 -0700
+++ b/test/hotspot/jtreg/TEST.groups	Tue Apr 24 21:40:10 2018 -0700
@@ -142,7 +142,9 @@
 
 ctw_2 = \
   applications/ctw/modules/java_base.java \
-  applications/ctw/modules/java_desktop.java
+  applications/ctw/modules/java_base_2.java \
+  applications/ctw/modules/java_desktop.java \
+  applications/ctw/modules/java_desktop_2.java
 
 ctw_3 = \
   applications/ctw/modules/javafx_graphics.java \
--- a/test/hotspot/jtreg/applications/ctw/modules/java_base.java	Tue Apr 24 20:25:48 2018 -0700
+++ b/test/hotspot/jtreg/applications/ctw/modules/java_base.java	Tue Apr 24 21:40:10 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @summary run CTW for all classes from java.base module
+ * @summary run CTW for some classes from java.base module
  *
  * @library /test/lib / /testlibrary/ctw/src
  * @modules java.base/jdk.internal.jimage
@@ -34,5 +34,5 @@
  * @build sun.hotspot.WhiteBox
  * @run driver ClassFileInstaller sun.hotspot.WhiteBox
  *                                sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.base
+ * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.base 0% 50%
  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/applications/ctw/modules/java_base_2.java	Tue Apr 24 21:40:10 2018 -0700
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @summary run CTW for some classes from java.base module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules java.base
+ *
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.base 50% 100%
+ */
--- a/test/hotspot/jtreg/applications/ctw/modules/java_desktop.java	Tue Apr 24 20:25:48 2018 -0700
+++ b/test/hotspot/jtreg/applications/ctw/modules/java_desktop.java	Tue Apr 24 21:40:10 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @summary run CTW for all classes from java.desktop module
+ * @summary run CTW for some classes from java.desktop module
  *
  * @library /test/lib / /testlibrary/ctw/src
  * @modules java.base/jdk.internal.jimage
@@ -34,5 +34,5 @@
  * @build sun.hotspot.WhiteBox
  * @run driver ClassFileInstaller sun.hotspot.WhiteBox
  *                                sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.desktop
+ * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.desktop 0% 50%
  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/applications/ctw/modules/java_desktop_2.java	Tue Apr 24 21:40:10 2018 -0700
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @summary run CTW for some classes from java.desktop module
+ *
+ * @library /test/lib / /testlibrary/ctw/src
+ * @modules java.base/jdk.internal.jimage
+ *          java.base/jdk.internal.misc
+ *          java.base/jdk.internal.reflect
+ * @modules java.desktop
+ *
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ *                                sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/timeout=7200 sun.hotspot.tools.ctw.CtwRunner modules:java.desktop 50% 100%
+ */
--- a/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java	Tue Apr 24 20:25:48 2018 -0700
+++ b/test/hotspot/jtreg/testlibrary/ctw/src/sun/hotspot/tools/ctw/CtwRunner.java	Tue Apr 24 21:40:10 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 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
@@ -52,11 +52,17 @@
     private static final Predicate<String> IS_CLASS_LINE = Pattern.compile(
             "^\\[\\d+\\]\\s*\\S+\\s*$").asPredicate();
 
+    private static final String USAGE = "Usage: CtwRunner <artifact to compile> [start[%] stop[%]]";
+
     public static void main(String[] args) throws Exception {
-        if (args.length != 1) {
-            throw new Error("Usage: <artifact to compile>");
+        CtwRunner runner;
+        switch (args.length) {
+            case 1: runner = new CtwRunner(args[0]); break;
+            case 3: runner = new CtwRunner(args[0], args[1], args[2]); break;
+            default: throw new Error(USAGE);
         }
-        new CtwRunner(args[0]).run();
+
+        runner.run();
     }
 
     private final List<Throwable> errors;
@@ -64,7 +70,10 @@
     private final Path targetPath;
     private final String targetName;
 
-    private CtwRunner(String target) {
+    private final int start, stop;
+    private final boolean isStartStopPercentage;
+
+    private CtwRunner(String target, String start, String stop) {
         if (target.startsWith("modules")) {
             targetPath = Paths
                     .get(Utils.TEST_JDK)
@@ -82,8 +91,29 @@
         }
         this.target = target;
         errors = new ArrayList<>();
+
+        if (start.endsWith("%") && stop.endsWith("%")) {
+            int startPercentage = Integer.parseInt(start.substring(0, start.length() - 1));;
+            int stopPercentage = Integer.parseInt(stop.substring(0, stop.length() - 1));
+            if (startPercentage < 0 || startPercentage > 100 ||
+                stopPercentage < 0 || stopPercentage > 100) {
+                throw new Error(USAGE);
+            }
+            this.start = startPercentage;
+            this.stop = stopPercentage;
+            this.isStartStopPercentage = true;
+        } else if (!start.endsWith("%") && !stop.endsWith("%")) {
+            this.start = Integer.parseInt(start);
+            this.stop = Integer.parseInt(stop);
+            this.isStartStopPercentage = false;
+        } else {
+            throw new Error(USAGE);
+        }
     }
 
+    private CtwRunner(String target) {
+        this(target, "0%", "100%");
+    }
 
     private void run() {
         startCtwforAllClasses();
@@ -105,15 +135,44 @@
         }
     }
 
+    private long start(long totalClassCount) {
+        if (isStartStopPercentage) {
+            return totalClassCount * start / 100;
+        } else if (start > totalClassCount) {
+            System.err.println("WARNING: start [" + start + "] > totalClassCount [" + totalClassCount + "]");
+            return totalClassCount;
+        } else {
+            return start;
+        }
+    }
+
+    private long stop(long totalClassCount) {
+        if (isStartStopPercentage) {
+            return totalClassCount * stop / 100;
+        } else if (stop > totalClassCount) {
+            System.err.println("WARNING: stop [" + start + "] > totalClassCount [" + totalClassCount + "]");
+            return totalClassCount;
+        } else {
+            return stop;
+        }
+    }
 
     private void startCtwforAllClasses() {
-        long classStart = 0L;
-        long classCount = classCount();
+        long totalClassCount = classCount();
+
+        long classStart = start(totalClassCount);
+        long classStop = stop(totalClassCount);
+
+        long classCount = classStop - classStart;
         Asserts.assertGreaterThan(classCount, 0L,
                 target + "(at " + targetPath + ") does not have any classes");
+
+        System.out.printf("Compiling %d classes (of %d total classes) starting at %d and ending at %d\n",
+                          classCount, totalClassCount, classStart, classStop);
+
         boolean done = false;
         while (!done) {
-            String[] cmd = cmd(classStart);
+            String[] cmd = cmd(classStart, classStop);
             try {
                 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
                         /* addTestVmAndJavaOptions = */ true,
@@ -138,11 +197,11 @@
                 Pair<String, Long> lastClass = getLastClass(out);
                 if (exitCode == 0) {
                     long lastIndex = lastClass == null ? -1 : lastClass.second;
-                    if (lastIndex != classCount) {
+                    if (lastIndex != classStop) {
                         errors.add(new Error(phase + ": Unexpected zero exit code"
                                 + "before finishing all compilations."
                                 + " lastClass[" + lastIndex
-                                + "] != classCount[" + classCount + "]"));
+                                + "] != classStop[" + classStop + "]"));
                     } else {
                         System.out.println("Executed CTW for all " + classCount
                                 + " classes in " + target + "(at " + targetPath + ")");
@@ -197,7 +256,7 @@
         return null;
     }
 
-    private String[] cmd(long classStart) {
+    private String[] cmd(long classStart, long classStop) {
         String phase = phaseName(classStart);
         return new String[] {
                 "-Xbatch",
@@ -206,6 +265,7 @@
                 "-XX:+UnlockDiagnosticVMOptions",
                 // define phase start
                 "-DCompileTheWorldStartAt=" + classStart,
+                "-DCompileTheWorldStopAt=" + classStop,
                 // CTW library uses WhiteBox API
                 "-XX:+WhiteBoxAPI", "-Xbootclasspath/a:.",
                 // export jdk.internal packages used by CTW library