RFR(S) 8211336 [TESTBUG] appcds tests with incorrect usage of -XX:+UseStringDeduplication
David Holmes
david.holmes at oracle.com
Tue Oct 30 07:54:43 UTC 2018
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