RFR [XS]: 8248429: Add --enable-preview as VM argument when running microbenchmarks

Magnus Ihse Bursie magnus.ihse.bursie at oracle.com
Tue Jun 30 16:40:46 UTC 2020



On 2020-06-30 18:19, Claes Redestad wrote:
>
>
> On 2020-06-30 17:16, Magnus Ihse Bursie wrote:
>>
>>
>> On 2020-06-30 16:48, Erik Joelsson wrote:
>>>
>>> On 2020-06-30 07:15, Magnus Ihse Bursie wrote:
>>>>
>>>>
>>>> On 2020-06-30 15:13, Claes Redestad wrote:
>>>>> Hi Jorn,
>>>>>
>>>>> On 2020-06-30 14:52, Jorn Vernee wrote:
>>>>>> Hi Claes,
>>>>>>
>>>>>> I see what you mean.
>>>>>>
>>>>>> I've created a patch that instead greps through all the benchmark 
>>>>>> source files, and finds files with `--enable-preview` in them. 
>>>>>> Then, only those files are compiled with --enable-preview, by 
>>>>>> using a separate call to SetupJavaCompilation.
>>>>>>
>>>>>> This relies on the fact that the benchmarks that use preview 
>>>>>> features also use `@Fork(... jvmAppendArgs= "--enable-preview")`, 
>>>>>> but, maybe a different marker can be used to mark benchmarks that 
>>>>>> need to be compiled with --enable-preview as well. Alternatively, 
>>>>>> we could use 2 separate directory structures to house preview and 
>>>>>> non-preview benchmarks. WDYT?
>>>>>>
>>>>>> Webrev: http://cr.openjdk.java.net/~jvernee/8248429/webrev.00/
>>>>>
>>>>> this looks great to me!
>>>> Not to rain on your parade, but I'm very skeptical of this. :-( 
>>>> Even just finding files is slow as it is on Windows (and we try 
>>>> hard to avoid that as much as possible during the build), greping 
>>>> through all files is even slower.
>>>>
>>> I'm also concerned about build performance, and in this context 
>>> incremental build performance. We try very hard to avoid $(shell) 
>>> calls in the makefiles, especially if these are used to generate 
>>> rules as those calls must then be made every time make is invoked to 
>>> figure out what files need to be rebuilt. Sometimes it's 
>>> unavoidable, and we do what we can to just minimize the damage. We 
>>> need to be clear on this being a worthwhile strategy before proceeding.
>>>
>>> Would it be possible to implement this filtering as a javac plugin 
>>> instead? That would reduce the need to process files just to figure 
>>> out if compilation is needed. We could also emulate this partly in 
>>> make by moving the SetupNativeCompilation calls into a sub make call 
>>> and only call those if any java file is newer than the compilation 
>>> target. This would result in a very convoluted makefile, but might 
>>> be worth it.
>> All this sounds very convoluted. I think the original patch was good 
>> enough, and I'd like to hear Claes argument again why all this 
>> complicated setup is needed. If it was just "well the other tests 
>> don't really need it", I think we can reply with "well, it doesn't 
>> hurt either, and it's too costly to apply it individually".
>
> as it turns out, javac --enable-preview tags all compiled classes as
> being preview enabled (classfile minor version 65535), so you now need
> to run java with --enable-preview to run any microbenchmark. This is a
> regression for existing microbenchmarks (one which I'm responsible for).
Ok.
>
> Jorn's patch here fixes that regression: no --enable-preview will be
> required to neither make test nor java -jar ../benchmarks.jar runs,
> thanks to how JMH runs the --enable-preview compiled benchmark code only
> in forks.
>
> An alternative workaround would be to add
> @Fork(jvmArgsAppend = "--enable-preview") to all micros, whether
> they use preview features or not. Perhaps that wouldn't be so bad,
> actually.
That sounds like a reasonable compromise, yes.

/Magnus
>
> /Claes
>
>>
>> /Magnus
>>>
>>> Now to the patch. One thing that can be done in this patch to 
>>> minimize damage is to use the RelativePath macro from Utils.gmk 
>>> instead of calling realpath in the shell. I would also avoid 
>>> building a full list of all java files and sending them to grep on a 
>>> single command line. Probably better to either find into xargs or 
>>> just let grep work recursively. Also please keep line length down so 
>>> that future side by side comparisons as well as 3-way merges are 
>>> still possible. We aren't strict on 80, but try to aim close to it.
>>>
>>> On a related note, how does this --enable-preview work when running 
>>> the microbenchmarks as a jtreg test?
>>>
>>> /Erik
>>>
>>>> Remind me again what problem this was supposed to solve that just 
>>>> adding --enable-preview to the compilation didn't solve..?
>>>>
>>>> /Magnus
>>>>>
>>>>>>
>>>>>> Testing: deleting build/<config>/support/test/micro and 
>>>>>> build/<config>/images/test/micro and confirming that compiling 
>>>>>> and running benchmarks with and without preview features works as 
>>>>>> expected. I don't think there's any automated tests for 
>>>>>> benchmarks right?
>>>>>
>>>>> Not really, no, but a tier1 build and test would at least build the
>>>>> micros and detect any issues with your shell calls on our range of
>>>>> platforms.
>>>>>
>>>>> While we support running the per-build micro artifacts in our 
>>>>> internal benchmarking system on an adhoc basis, our promotion 
>>>>> testing (where this
>>>>> would have been discovered) is still a bit semi-automatic in 
>>>>> regards to
>>>>> when we roll over to a new benchmarks.jar.
>>>>>
>>>>> /Claes
>>>>>
>>>>>>
>>>>>> Jorn
>>>>>>
>>>>>> On 27/06/2020 01:38, Claes Redestad wrote:
>>>>>>> Patch looks fine (although you might want to update the comment).
>>>>>>>
>>>>>>> It's more concerning that I didn't catch this (seems all tests of
>>>>>>> mine were with --enable-preview), and we'll still inconvenience 
>>>>>>> users
>>>>>>> who need to run the jar file directly. So it seems we should 
>>>>>>> consider
>>>>>>> fixing so that only those benchmarks that actually need 
>>>>>>> --enable-preview
>>>>>>> are built with that flag.
>>>>>>>
>>>>>>> /Claes
>>>>>>>
>>>>>>> On 2020-06-27 00:21, Jorn Vernee wrote:
>>>>>>>> Forgot to attach the JBS link: 
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8248429
>>>>>>>>
>>>>>>>> Jorn
>>>>>>>>
>>>>>>>> On 27/06/2020 00:14, Jorn Vernee wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8248135 added 
>>>>>>>>> --enable-preview to the javac options when building micro 
>>>>>>>>> benchmarks.
>>>>>>>>>
>>>>>>>>> We should also add it to the set of default VM arguments 
>>>>>>>>> passed to the microbenchmark jar so it doesn't need to be 
>>>>>>>>> passed manually.
>>>>>>>>>
>>>>>>>>> If --enable-preview is not passed, the microbenchmarks can not 
>>>>>>>>> be run (even the ones that don't use preview features). Since 
>>>>>>>>> the class files have a modified minor version due to building 
>>>>>>>>> with --enable-preview, the VM must also be started with 
>>>>>>>>> --enable-preview in order to be able to load the classes. In 
>>>>>>>>> the absence of --enable-preview, for instance the following 
>>>>>>>>> error will occur:
>>>>>>>>>
>>>>>>>>> java.lang.UnsupportedClassVersionError: Preview features are 
>>>>>>>>> not enabled for 
>>>>>>>>> org/openjdk/bench/jdk/incubator/foreign/generated/CallOverhead_panama_args10_jmhTest 
>>>>>>>>> (class file version 60.65535). Try running with 
>>>>>>>>> '--enable-preview'
>>>>>>>>>         at java.base/java.lang.ClassLoader.defineClass1(Native 
>>>>>>>>> Method)
>>>>>>>>>         at 
>>>>>>>>> java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:825) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:723) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:646) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:604) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>>>>>>>>>         at java.base/java.lang.Class.forName0(Native Method)
>>>>>>>>>         at java.base/java.lang.Class.forName(Class.java:377)
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.util.ClassUtils.loadClass(ClassUtils.java:72)
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.BenchmarkHandler.<init>(BenchmarkHandler.java:68) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.BaseRunner.runBenchmark(BaseRunner.java:233) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.BaseRunner.doSingle(BaseRunner.java:139)
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.BaseRunner.runBenchmarksForked(BaseRunner.java:76) 
>>>>>>>>>
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.ForkedRunner.run(ForkedRunner.java:72)
>>>>>>>>>         at 
>>>>>>>>> org.openjdk.jmh.runner.ForkedMain.main(ForkedMain.java:84)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Please review the patch attached inline at [1].
>>>>>>>>>
>>>>>>>>> Testing: running a microbenchmark without passing 
>>>>>>>>> '--enable-preview' manually and confirming that it doesn't 
>>>>>>>>> fail to load the classes.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Jorn
>>>>>>>>>
>>>>>>>>> [1] :
>>>>>>>>>
>>>>>>>>> diff --git a/make/RunTests.gmk b/make/RunTests.gmk
>>>>>>>>> index 721bb827639..59911d89e9f 100644
>>>>>>>>> --- a/make/RunTests.gmk
>>>>>>>>> +++ b/make/RunTests.gmk
>>>>>>>>> @@ -691,7 +691,7 @@ define SetupRunMicroTestBody
>>>>>>>>>    endif
>>>>>>>>>
>>>>>>>>>    # Set library path for native dependencies
>>>>>>>>> -  $1_JMH_JVM_ARGS := 
>>>>>>>>> -Djava.library.path=$$(TEST_IMAGE_DIR)/micro/native
>>>>>>>>> +  $1_JMH_JVM_ARGS := 
>>>>>>>>> -Djava.library.path=$$(TEST_IMAGE_DIR)/micro/native 
>>>>>>>>> --enable-preview
>>>>>>>>>
>>>>>>>>>    ifneq ($$(MICRO_VM_OPTIONS)$$(MICRO_JAVA_OPTIONS), )
>>>>>>>>>      $1_JMH_JVM_ARGS += $$(MICRO_VM_OPTIONS) 
>>>>>>>>> $$(MICRO_JAVA_OPTIONS)
>>>>>>>>>
>>>>
>>




More information about the build-dev mailing list