jtreg is unable to detect SkippedException because it is wrapped by Compiler Framework

XMLWordPrintable

      There is a number of compiler tests that cannot run if an agent is present.

      The Compiler Framework is able to detect this and throw jtreg.SkippedException, however jtreg doesn't recognize this and does not mark the test as skipped, because the SkippedExeption get wrapped into compiler.lib.compile_framework.CompileFrameworkException.

      ===
      compiler.lib.compile_framework.CompileFrameworkException: Exception in Compile Framework:
      Invocation target:
      at compiler.lib.compile_framework.CompileFramework.invoke(CompileFramework.java:135)
      at compiler.igvn.TestMinMaxIdentity.main(TestMinMaxIdentity.java:62)
      at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
      at java.base/java.lang.reflect.Method.invoke(Method.java:565)
      at com.sun.javatest.regtest.agent.MainWrapper$MainTask.run(MainWrapper.java:138)
      at java.base/java.lang.Thread.run(Thread.java:1527)
      Caused by: java.lang.reflect.InvocationTargetException
      at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
      at java.base/java.lang.reflect.Method.invoke(Method.java:565)
      at compiler.lib.compile_framework.CompileFramework.invoke(CompileFramework.java:131)
      ... 5 more
      Caused by: jtreg.SkippedException: Can't run test with agent.
      at compiler.lib.ir_framework.TestFramework.checkCompatibleFlags(TestFramework.java:855)
      at compiler.lib.ir_framework.TestFramework.start(TestFramework.java:425)
      at compiler.igvn.templated.MinMaxIdentity.main(MinMaxIdentity.java:13)
      at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
      ... 7 more

      ===

      Can be reproduced with async profiler:

      $ make test JTREG="VERBOSE=summary,fail,error;JAVA_OPTIONS=-agentpath:../async-profiler-binaries/lib/libasyncProfiler.dylib=start,event=cpu,cstack=vm,loglevel=none,flat,file=/dev/null" TEST="test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java"

      The solution is to recognize SkippedException in the causes for InvocationTargetException and throw it explicitly in compiler.lib.compile_framework.CompileFramework.invoke():

      public Object invoke(String className, String methodName, Object[] args) {
               } catch (IllegalAccessException e) {
                   throw new CompileFrameworkException("Illegal access:", e);
               } catch (InvocationTargetException e) {
      + findJtregSkippedExceptionInCauses(e).ifPresent(ex -> { throw ex; });
                   throw new CompileFrameworkException("Invocation target:", e);
               }
           }
      ...

      I verified the fix and it worked:

      Running test 'jtreg:test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java'
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v008-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vanilla-U
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v016-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v004-U
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v004-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vanilla-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v008-U
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v016-U
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v032-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v032-U
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v064-A
      Passed: compiler/loopopts/superword/TestDependencyOffsets.java#vec-v064-U
      Test results: passed: 12; skipped: 12; did not meet platform requirements: 22
      Report written to /Users/kirshiro/ws/openjdk/jdk-tip1/build/macosx-aarch64-server-release/test-results/jtreg_test_hotspot_jtreg_compiler_loopopts_superword_TestDependencyOffsets_java/html/report.html
      Results written to /Users/kirshiro/ws/openjdk/jdk-tip1/build/macosx-aarch64-server-release/test-support/jtreg_test_hotspot_jtreg_compiler_loopopts_superword_TestDependencyOffsets_java
      Finished running test 'jtreg:test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java'
      Test report is stored in build/macosx-aarch64-server-release/test-results/jtreg_test_hotspot_jtreg_compiler_loopopts_superword_TestDependencyOffsets_java

      ==============================
      Test summary
      ==============================
         TEST TOTAL PASS FAIL ERROR SKIP
         jtreg:test/hotspot/jtreg/compiler/loopopts/superword/TestDependencyOffsets.java
                                                              34 0 0 0 34
      ==============================
      TEST SUCCESS

            Assignee:
            Kirill Shirokov
            Reporter:
            Kirill Shirokov
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated: