RFR(S) 8211336 [TESTBUG] appcds tests with incorrect usage of -XX:+UseStringDeduplication
David Holmes
david.holmes at oracle.com
Wed Oct 31 01:19:56 UTC 2018
Hi Ioi,
On 31/10/2018 3:22 AM, Ioi Lam wrote:
> OK David, you convinced me, and Roger's presence reminded me that I can
> use Lambdas :-)
>
> http://cr.openjdk.java.net/~iklam/jdk12/8211336-cds-test-fix-for-string-dedup.v02/index.html
>
>
> This new version puts the set of option combos in a single place so it
> would be easy to add to in the future.
Okay took me a little while to realize where the options were hidden but
makes sense now. :)
This looks good to me.
Thanks,
David
> Thanks
>
> - Ioi
>
>
> On 10/30/18 6:40 AM, Roger Riggs wrote:
>> Hi,
>>
>> Running the driver multiple times also slows down testing as it has to
>> invoke
>> the driver each time so it almost doubles the number of times java is
>> invoked.
>>
>> I'm not too distracted by parameters to the driver being used to
>> invoke the actual
>> test, that would seem pretty normal but it may deserve some additional
>> doc
>> since on the first read they -XX:xxx looks out of place.
>>
>> $.02, Roger
>>
>>
>> On 10/30/18 3:54 AM, David Holmes wrote:
>>> On 30/10/2018 2:54 PM, Ioi Lam wrote:
>>>> On 10/29/18 8:16 PM, David Holmes wrote:
>>>>> On 30/10/2018 12:23 PM, Ioi Lam wrote:
>>>>>> On 10/29/18 6:23 PM, David Holmes wrote:
>>>>>>> Hi Ioi,
>>>>>>>
>>>>>>> On 30/10/2018 7:32 AM, Ioi Lam wrote:
>>>>>>>> http://cr.openjdk.java.net/~iklam/jdk12/8211336-cds-test-fix-for-string-dedup.v01/
>>>>>>>>
>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8211336
>>>>>>>>
>>>>>>>> Please review this small test fix:
>>>>>>>>
>>>>>>>> These are "shell" tests that need to pass certain options (such as
>>>>>>>> -XX:+UseStringDeduplication) to child JVM processes that are
>>>>>>>> launched via
>>>>>>>> jdk.test.lib.process.ProcessTools. The tests were using this:
>>>>>>>>
>>>>>>>> * @run main/othervm -XX:+UseStringDeduplication ExerciseGC
>>>>>>>>
>>>>>>>> However, options passed this way are not passed by ProcessTools.
>>>>>>>> The fix is
>>>>>>>> to change to the following
>>>>>>>>
>>>>>>>> * @run driver ExerciseGC -XX:+UseStringDeduplication
>>>>>>>>
>>>>>>>> and let the main test program explicitly pass args[] (indirectly)
>>>>>>>> to ProcessTools.
>>>>>>>
>>>>>>> That looks really weird to me. I would not expect to pass things
>>>>>>> this way. If the test is only intending to launch other VMs then
>>>>>>> the logic to add -XX:+UseStringDeduplication should be an
>>>>>>> explicit part of the test, directly in the main test logic, not
>>>>>>> incidentally passed through via the mechanism you suggest.
>>>>>>>
>>>>>>
>>>>>>
>>>>>> The 11 tests each originally had only one @run flag, like
>>>>>>
>>>>>> * @run driver ExerciseGC
>>>>>>
>>>>>> Later, it was suggested (JDK-8185531) to add more flag
>>>>>> combinations, such as -XX:+UseStringDeduplication and
>>>>>> -XX:-CompactStrings, to increase test coverage. It's pretty common
>>>>>> to do this by adding a new @run tag with different flags, as done
>>>>>> in JDK-8185531. The only problem is JDK-8185531 doesn't work
>>>>>> because jtreg doesn't pass the additional flags to the child
>>>>>> processes. Hence the fix in this RFR.
>>>>>
>>>>> Understood. But tests that launch other VMs to do the real testing
>>>>> generally manage the flag coverage themselves. The way you have
>>>>> done it here just seems really bizarre and non-obvious i.e. you
>>>>> have to realize that the intended flags get passed via the args to
>>>>> main and there can't be any real args for the test. And its tricky
>>>>> to run outside jtreg as you have to manually.
>>>>>
>>>>> I see two AOT tests that employ a similar scheme, but I don't like it.
>>>>
>>>> There are plenty of tests that run the main test class multiple
>>>> times with different parameters using multiple @run tags. Just do a
>>>>
>>>> grep -R '@run.*XX'
>>>>
>>>> And there are plenty of test classes whose main method accept extra
>>>> parameters from @run. What you described, including the difficulty
>>>> of running tests manually outside of jtreg, apply equally to these
>>>> tests.
>>>>
>>>> What I am doing is not out of the ordinary.
>>>
>>> Yes it is. Those other @run uses may add -XX args to othervm
>>> invocations but they don't pass -XX args to the Java test program.
>>> The difference is in:
>>>
>>> -XX:Foo TheTest
>>>
>>> and
>>>
>>> TheTest -XX:Foo
>>>
>>>> If only jtreg could make things easier ..... but that's outside of
>>>> the scope of this bug.
>>>
>>> I don't see this as a jtreg issue. Your Java tests want to launch
>>> separate JVMs with specific sets of arguments. Maybe ProcessTools
>>> could help with that, but not jtreg.
>>>
>>>>> there can't be any real args for the test.
>>>>
>>>> but these test cases don't need any "real" args.
>>>
>>> That's fortunate isn't it. ;-) If they had needed them and you then
>>> had to implement arg parsing to split out the -XX args from the real
>>> ones would you still have used this mechanism?
>>>
>>>>>
>>>>>> This way it's easy to add other VM flag combinations to the tests.
>>>>>> You don't need to modify the test sources identically 11 times
>>>>>> just to add a new flag combination to these 11 tests.
>>>>>
>>>>> Umm how do you not have to modify the test source identically 11
>>>>> times when you have to add the new arg to the "@run driver ..."
>>>>> command, or add a new @run driver line??
>>>>>
>>>> What I mean is, I'd rather add new @run lines, than edit the Java code.
>>>>
>>>> If you have a better suggestion, I'd love to hear it. But the last
>>>> thing I want to do, is to cut-and-paste the test body multiple
>>>> times, or add in some sort of for loop so I can run the test body
>>>> multiple times with different VM parameters.
>>>
>>> A loop is exactly what I'd suggest. Though it could perhaps be hidden
>>> in a ProcessTools utility function. I don't see what the issue is
>>> with a loop.
>>>
>>> public static void main(String[] args) throws Exception {
>>> String[][] arglists = {
>>> { },
>>> { "-XX:+UseStringDeduplication" },
>>> { "-XX:-CompactStrings" }
>>> };
>>> for (String[] vmargs : arglists) {
>>> SharedStringsUtils.setVMOptionsPrefix(vmargs);
>>> ...
>>> }
>>> }
>>>
>>> You're currently using jtreg plus multiple @run driver lines to get
>>> the effect of a loop.
>>>
>>> Anyway just my 2c. If others don't mind this approach I won't insist
>>> on not using it.
>>>
>>> Cheers,
>>> David
>>>
>>>>
>>>> Thanks
>>>> - Ioi
>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>>> Thanks
>>>>>> - Ioi
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> David
>>>>>>> -----
>>>>>>>
>>>>>>>> (I also cleaned up some unnecessary @module tags)
>>>>>>>>
>>>>>>>> Test in progress with hs-tier1/2.
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> - Ioi
>>>>>>
>>>>
>>
>
More information about the hotspot-runtime-dev
mailing list