RFR: 8160088: update hotspot tests depending on GC to use @requires vm.gc.X

Dmitry Fazunenko dmitry.fazunenko at oracle.com
Fri Jun 24 08:54:36 UTC 2016


Hi David,

On 24.06.2016 9:48, David Holmes wrote:
> Thanks for the info Dima! I may have missed it but I think this new 
> @requires functionality needs some broader advertising. :)

That functionality was introduced on this alias as well:
http://mail.openjdk.java.net/pipermail/hotspot-dev/2016-April/022443.html
But I agree, "Implement setting jtreg @requires properties vm.flavor, 
vm.bits, vm.compMode" doesn't
attract much attention.
If I were from sales, I would write: "Braking news: jtreg introduces 
smart keywords"  :)

>
> I'm still not 100% sure what something like vm.gc.G1 means though. 
> Looking at this comment:
>
> /**
> * For all existing GC sets vm.gc.X property.
> * Example vm.gc.G1=true means:
> *    VM supports G1
> *    User either set G1 explicitely (-XX:+UseG1GC) or did not set any GC
>
> I think it would have been more accurate to add "and the selected GC 
> is G1" - right? 

No. vm.gc.G1 means:
The test needs to set G1 GC via -XX:+UseG1GC
It requires:
1) vm supports G1 (minimal VM doesn't)
2) User didn't say: -XX:+UseSerialGC  ,-XX:+UseParallelGC -XX:+UseCMSGC 
(otherwise it will be a flag conflict)
Note:  User may say: -XX:+UseG1GC

> That is what the logic seems to do (though I'm not sure why it checks 
> both current and currentSetByErgo ??)

There is a class of machines where ergonomics selects Serial GC if no 
other GC is specified explicitly.
For such machines currentGC might be "Serial" but setting G1 is still 
possible.
currentSetByErgo == false means: no other collector but currently 
selected is available for setting via -XX:UseXGC.

I know that the current description is hard to understand, but I didn't 
come up with a better wording.

>
> Anyway for this set of test changes everything seems fine.

Thanks a lot!

-- Dima

>
> Thanks,
> David
>
> On 23/06/2016 10:52 PM, Dmitry Fazunenko wrote:
>> David,
>>
>> On 23.06.2016 14:00, David Holmes wrote:
>>> Hi Dmitry,
>>>
>>> On 23/06/2016 6:52 PM, Dmitry Fazunenko wrote:
>>>> Hi David,
>>>>
>>>> thanks for looking!
>>>>
>>>> On 23.06.2016 3:17, David Holmes wrote:
>>>>> Hi Dmitry,
>>>>>
>>>>> On 23/06/2016 4:06 AM, Dmitry Fazunenko wrote:
>>>>>> Hello,
>>>>>>
>>>>>> I'm looking for Reviewers for relatively simple fix which affects 59
>>>>>> tests.
>>>>>>   https://bugs.openjdk.java.net/browse/JDK-8160088
>>>>>> http://cr.openjdk.java.net/~dfazunen/8160088/webrev.00/
>>>>>>
>>>>>> The fix allows to skip execution of tests requiring a specific GC in
>>>>>> case of the required GC is not supported by VM.
>>>>>> Old variant:
>>>>>>   @requires vm.gc == null | vm.gc == "G1"
>>>>>>      A test will be executed if no GC is specified externally or
>>>>>> -XX:+UseG1GC flag is given.
>>>>>>      This test will be executed even if VM doesn't support G1 and
>>>>>> fail.
>>>>>> New variant:
>>>>>>   @requires vm.gc.G1
>>>>>>      This test will not be executed if VM doesn't support G1.
>>>>>
>>>>> That doesn't seem sufficient. What you want is that if the test
>>>>> requires G1 then it also supports G1, so it seems to me the correct
>>>>> formulation is:
>>>>>
>>>>> @requires (vm.gc == null |   // null -> default -> g1 (usually)
>>>>>            vm.gc == G1 ) &
>>>>>            vm.gc.G1
>>>>
>>>> No, vm.gc.G1 is an alias to: (vm.gc == null | vm.gc == g1) &
>>>> vm.gc.supportsG1.
>>>
>>> Wow - on the one hand that is a compact/succinct syntax. On the other
>>> hand - no one will recognize what it actually means! I think I have
>>> missed a discussed I would like to have given input on!
>>
>> It was discussed on hotspot-gc-dev alias as part of '8151283' review:
>> http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2016-June/018352.html 
>>
>>
>> Originally it was proposed names like: vm.gc.G1.acceptable
>> but after input from GC dev, vm.gc.G1 was selected.
>> Documentation how the properties are set what that mean is available in
>> the class source (jtreg plugin):
>>  <jdk-root>/test/jtreg-ext/requires/VMProps.java
>>
>>
>>>
>>>>>
>>>>> Aside: how does jtreg determine which GC's are supported?
>>>> Sorry for not providing the full history here:
>>>>
>>>> CODETOOLS-7901583: jtreg should provide extensible mechanism for
>>>> @requires properties
>>>> - change to jtreg that allows a Test Suite to introduce its own
>>>> @requires props
>>>>
>>>> JDK-8152432: Implement setting jtreg @requires properties vm.flavor,
>>>> vm.bits, vm.compMode
>>>> - implementation that mechanism in hotspot
>>>>
>>>> JDK-8154096: Extend WhiteBox API with methods which retrieve from VM
>>>> information about available GC
>>>> - fix which allows to know if a GC is supported
>>>>
>>>> JDK-8151283: Implement setting jtreg @requires property
>>>> vm.isG1Supported.
>>>> - introduction vm.gc.G1, vm.gc.Serial, vm.gc.Parallel and
>>>> vm.gc.ConcMarkSweep
>>>>
>>>> JDK-8160088 (this one): update hotspot tests depending on GC to use
>>>> @requires vm.gc.X
>>>> - culmination: update tests to use new functionality
>>>
>>> Wow I have missed out on a lot it seem! :(
>>>
>>> What version of jtreg supports this level of customized @requires?
>>> Someone has already encountered the following error:
>>>
>>> Error. Parse Exception: Syntax error in @requires expression: invalid
>>> name: XXX
>>>
>>> for a new @requires XXX clause.
>>
>> It was implemented in the final build of jtreg4.1 and of course it's
>> available in jtreg4.2
>> Quiting jtreg/doc/jtreg/tag-spec.html:
>>
>> |requires.extraPropDefns <source-files>|
>>
>>     This option is used to provide source files for classes that will be
>>     used at the beginning of each test suite run, to determine
>>     additional characteristics of the system for use with the
>>     |@requires| tag. Each class must implement
>>     |java.util.concurrent.Callable<java.util.Map<String, String>>|. When
>>     invoked, the |call()| method should return properties that can be
>>     referenced in an expression in a |@requires| tag. /Note:/ the names
>>     of the new properties that may be returned by calling these classes
>>     must also be declared in a |requires.properties| entry.
>>
>>     If this option is specified, the following additional options may
>>     also be specified:
>>
>>       * |requires.extraPropDefns.libs <source-files>| — source files for
>>         classes that will be put on the classpath when the primary
>>         classes are run.
>>       * |requires.extraPropDefns.bootlibs <source-files>| — source files
>>         for classes that will be put on the bootclasspath when the
>>         primary classes are run.
>>       * |requires.extraPropDefns.javacOpts <options>| — options that
>>         will be passed to javac when the source files are compiled.
>>       * |requires.extraPropDefns.vmOpts <options>| — options that will
>>         be passed to VM when the classes are executed.
>>
>>     In this family of options, if a source file is enclosed in square
>>     brackets, no error message will be given if the file is not 
>> available.
>>
>> The following properties may appear in either TEST.ROOT or any
>> TEST.properties file:
>>
>> The reason, why @requires XXX is not recognized by jtreg - XXX is not
>> registered in TEST.ROOT.
>> See: hotspot/test/TEST.ROOT for example on how to register new props.
>>
>> For the time being recently introduced requires properties are available
>> only in the hotspot repository.
>> To introduce them in jdk - a few lines from hotspot/test/TEST.ROOT
>> should be placed in jdk/test/TEST.ROOT
>> We haven't done this yet, because we are considering a possibility to
>> move VM specific tests from jdk into hotspot repo.
>>
>> Thanks,
>> Dima
>>
>>
>>>
>>> Thanks,
>>> David
>>>
>>>> Thanks,
>>>> Dima
>>>>
>>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>>> Testing:
>>>>>> 1) starting jtreg with various collectors with "-c" option to verify
>>>>>> correctness of test descriptions.
>>>>>>     Number of selected tests before and after change is the same:
>>>>>> -XX:+UseG1GC:  1,456
>>>>>> -XX:+UseSerialGC: 1,366
>>>>>> -XX:+UseParallelGC: 1,369
>>>>>> -XX:+UseConcMarkSweepGC: 1,368
>>>>>> Default:  1,483; error
>>>>>>
>>>>>> 2) RBT (in progress)
>>>>>>
>>>>>> 3) Diff is analyzed manually (only necessary lines are affected):
>>>>>> #> hg diff |grep "^- " |sort -u
>>>>>> - * @requires (vm.gc == "G1" | vm.gc == "null")
>>>>>> - * @requires (vm.gc=="G1" | vm.gc=="null")
>>>>>> - * @requires vm.gc == "G1" | vm.gc == "null"
>>>>>> - * @requires vm.gc=="ConcMarkSweep" | vm.gc == "null"
>>>>>> - * @requires vm.gc=="ConcMarkSweep" | vm.gc=="null"
>>>>>> - * @requires vm.gc=="G1" | vm.gc =="null"
>>>>>> - * @requires vm.gc=="G1" | vm.gc=="null"
>>>>>> - * @requires vm.gc=="Parallel" | vm.gc=="null"
>>>>>> - * @requires vm.gc=="Serial" | vm.gc=="null"
>>>>>> - * @requires vm.gc=="null" | vm.gc=="G1"
>>>>>> - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>> - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>> - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>> - * Copyright (c) 2015, Oracle and/or its affiliates. All rights
>>>>>> reserved.
>>>>>> #> hg diff |grep "^+ " |sort -u
>>>>>> + * @requires vm.gc.ConcMarkSweep
>>>>>> + * @requires vm.gc.G1
>>>>>> + * @requires vm.gc.Parallel
>>>>>> + * @requires vm.gc.Serial
>>>>>> + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>> + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>> + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All 
>>>>>> rights
>>>>>> reserved.
>>>>>>
>>>>>> Thanks,
>>>>>> Dima
>>>>
>>



More information about the hotspot-dev mailing list