RFR (L): 8024319: Add regression tests on documented GC-related -XX:+Print* options

Bengt Rutisson bengt.rutisson at oracle.com
Fri Jan 23 09:02:35 UTC 2015


Hi Dima,

Sorry top posting, but the email thread is getting pretty long. :)

You wrote:

"It will look like many others tests written with ProcessTools:
http://hg.openjdk.java.net/jdk9/hs-gc/hotspot/file/e6a0cfbfdc9a/test/gc/g1/TestGCLogMessages.java 
"

I already suggested to use this approach in an earlier email. This is 
much more readable and less error prone than the new framework that you 
proposed. So, I much prefer the tests to be implemented this way.

Bengt


On 2015-01-22 14:57, Dmitry Fazunenko wrote:
>
> On 22.01.2015 15:51, Bengt Rutisson wrote:
>>
>> Hi Dima,
>>
>> On 2015-01-22 12:42, Dmitry Fazunenko wrote:
>>> Hi Bengt!
>>>
>>> Thanks for looking at the tests and sharing your thoughts!
>>>
>>> Yes, it was considered to use ProcessTool but we decided to 
>>> introduce AbstractPringGCTest class.
>>> Our thoughts:
>>> - log generation and log analysis are two different tasks, and they 
>>> should logically separated:
>>
>> Ok, but that's how it is with ProcessTool as well. Only it is much 
>> clearer how the output you analyze is connected to the process you 
>> ran if you use ProcessTool. I don't like how using 
>> AbstractPrintGCTest requires that you name the -Xloggc file correct.
>
> It's a very little concern. When you develop code you need to use 
> variables declared previously. If you make a mistake the compiler will 
> tell you.
> The same is here, if you make the test will fail when you try to run it.
>
>>
>>>     * starting GCTask with various options  (one line @run 
>>> main/othervm ... GCTask)
>>
>> GCTask is fine. The name is a bit odd, but I understand the need for 
>> a common class to do allocations to trigger GC.
>
> It's ok to rename.
>
>>
>>>     * log analysis (the java code within sources)
>>
>> Right. And you use the OutputAnalyzer just like you would if you were 
>> using ProcessTool.
>>
>>> this increases readability
>>
>> I disagree that adding a new abstract class increases readability.
>
> In this case the abstract class hides the code which not important for 
> the test logic.
> When you look at the test source you see only what is related to that 
> particular test:
>
> http://cr.openjdk.java.net/~eistepan/dkononen/8024319/webrev.00/raw_files/new/test/gc/logging/TestPrintAdaptiveSizePolicyParallelGCEnabled.java 
>
>
>
>
>>
>>> - it's possible to provide several checkers for the same log
>>>     @run main/othervm ... GCTask
>>>     @run main TestCheck1
>>>     @run main TestCheck2
>>
>> You can grab the output from the ProcessTool and pass it to several 
>> checkers too. I don't see the differences.
>>
>>> ...
>>>     @run main TestCheck3
>>>   or provide the same check for several logs (not currently 
>>> implemented)
>>>     @run main/othervm ... -loggc:log1 GCTask
>>>     @run main/othervm ... -loggc:log2 GCTask
>>>     @run main/othervm ... -loggc:log3 GCTask
>>>     ...
>>>     @run main TestCheck log1 log2 log3
>>
>> Again, I don't see how AbstractPringGCTest is any different here 
>> compared to just grabbing the output from the ProcessTool.
>>
>>>
>>> - writing log to a dedicated file will guarantee, that program 
>>> output and the GC log will not be mixed up.
>>>   (not valid argument for that particular case, bun in general 
>>> that's true)
>>
>> That's a valid point. But it shouldn't be much of a problem since the 
>> tests are under our control. It is up to us what we log on System.out.
>>
>>>
>>> - using @run main/othervm will allow to *not ignore* external 
>>> options (jtreg -vmoptions:...), that makes such tests applicable for 
>>> wider range of configurations and check, that for example -Xcomp 
>>> doesn't turn off PrintGCDetails...
>>
>> You can pass the external options on to ProcessTool.
>
> Passing external option in the each test?.. It will duplicate jtreg 
> functionality and bring extra lines.
>
>>
>>>
>>>
>>> Regarding AbstractPringGCTes: it doesn't duplicate any 
>>> functionality, it just reads content of a text file.
>>
>> Yes, but getting the output from a process is what ProcessTool does. 
>> So, it duplicates the functionality of getting the GC output.
>
> Reading text file content takes one line of code. I think we can 
> afford this duplication.
>
>>
>>>
>>> Regarding ProcessTools. Yes, it's possible to develop tests with 
>>> this library. This library itself is very good and powerful. But I 
>>> personally would not recommend using it for test development because 
>>> it duplicates harness functionality. Unfortunately, jtreg currently 
>>> doesn't provide all functionality required for VM testing and we 
>>> have to use ProcessTools as workaround.
>>> And people already got used to ProcessTools and like this style. But 
>>> in long term, there will be the same problem with support of such 
>>> tests, as we experience now with tests written in shell. Indeed, 
>>> using ProcessTools is like using java for shell scripting.
>>
>> The long term support will be made more complex if we introduce yet 
>> another way of doing the same thing.
>
> Absolutely! ProcessTools  is another way of starting new VM, "@run 
> othervm"  already does it. What I suggest is to stop using alternative 
> ways to start VM and rely on the harness.
>
> BTW, I don't see anything new in the suggested approach.
>
>>
>>>
>>> Returning to Denis' tests. They intentionally do not use 
>>> ProcessTools. They could be used as example demonstrating an 
>>> alternative approach.
>>
>> Yes, I think it would be interesting to see what the tests would look 
>> like based on ProcessTool.
>
> It will look like many others tests written with ProcessTools:
> http://hg.openjdk.java.net/jdk9/hs-gc/hotspot/file/e6a0cfbfdc9a/test/gc/g1/TestGCLogMessages.java 
>
>
> you already get used to this file and find it convenient. But it's 
> really hard to understand the logic.
>
> Thanks,
> Dima
>
>
>>
>> Thanks,
>> Bengt
>>
>>>
>>> Thanks,
>>> Dima
>>>
>>>
>>>
>>> On 22.01.2015 10:26, Bengt Rutisson wrote:
>>>>
>>>> On 2015-01-22 08:20, Bengt Rutisson wrote:
>>>>>
>>>>> Hi Denis,
>>>>>
>>>>> Not a full review, but I have a question.
>>>>>
>>>>> It seems like the AbstractPrintGCTest is kind of duplicating what 
>>>>> ProcessTools already does. Have you considered using 
>>>>> ProcessTools.createJavaProcessBuilder(..) instead of the @run 
>>>>> commands to automatically get the process control and log support 
>>>>> instead of introducing the AbstractPrintGCTest class?
>>>>
>>>> Here's an example of how I mean that you can use 
>>>> ProcessTools.createJavaProcessBuilder() instead:
>>>>
>>>> http://hg.openjdk.java.net/jdk9/hs-gc/hotspot/file/e6a0cfbfdc9a/test/gc/g1/TestGCLogMessages.java 
>>>>
>>>>
>>>> Bengt
>>>>
>>>>>
>>>>> Thanks,
>>>>> Bengt
>>>>>
>>>>> On 2015-01-20 16:49, denis kononenko wrote:
>>>>>> Hi All,
>>>>>>
>>>>>> Could you please review new tests on GC-related -XX:Print options.
>>>>>>
>>>>>> Webrev link: 
>>>>>> http://cr.openjdk.java.net/~eistepan/dkononen/8024319/webrev.00/
>>>>>> Bug id: https://bugs.openjdk.java.net/browse/JDK-8024319
>>>>>> Testing: automated
>>>>>> Description:
>>>>>>
>>>>>> There is a group of new tests to test the following GC options:
>>>>>>
>>>>>> -XX:+-PrintAdaptiveSizePolicy
>>>>>> -XX:+-PrintGCApplicationConcurrentTime
>>>>>> -XX:+-PrintGCApplicationStoppedTime
>>>>>> -XX:+-PrintGCDateStamps
>>>>>> -XX:+-PrintGCDetails
>>>>>> -XX:+-PrintGC
>>>>>> -XX:+-PrintGCTimeStamps
>>>>>> -XX:+-PrintTenuringDistribution
>>>>>>
>>>>>> Each of the tested options has a pair of corresponding tests, one 
>>>>>> is for testing an enabled option and another for disabled. The 
>>>>>> tests are simple parsers of GC's logger output and looking for a 
>>>>>> specific marker corresponding to the tested option. The output is 
>>>>>> provided by another process which is implemented in GCTask.java. 
>>>>>> It's necessary because we have to guarantee that GC's log has 
>>>>>> been completely written and committed to the filesystem before we 
>>>>>> start analyzing it. The most obvious solution is to politely 
>>>>>> finish the writing process. Thus the every test spawns an 
>>>>>> auxiliary process which produces GC's log file, waits for its 
>>>>>> finish, loads the output and then performs actual testing. These 
>>>>>> steps are implemented with jtreg's annotations and a helper class 
>>>>>> which can be found AbstractPrintGCTest.java. This class 
>>>>>> encapsulates reading GC's log output from the log file and 
>>>>>> provides that output to the tests.
>>>>>>
>>>>>> To get GC's logger working GCTask forces the garbage collecting 
>>>>>> process. It attempts to consume all memory available to the young 
>>>>>> generation by creating a lot of unreferenced objects. Sooner or 
>>>>>> later the garbage collector shall be invoked. In favor of 
>>>>>> performance the task is implemented to be ran with a small memory 
>>>>>> size less or equal to 128 megabytes. This is excplicitly 
>>>>>> specified with -Xmx JVM's option in jtreg's annotations.
>>>>>>
>>>>>> Please note that some options work for specific GCs only. To 
>>>>>> prevent them from being executed against wrong GC jtreg's 
>>>>>> annotations and groups are used.
>>>>>>
>>>>>> Thank you,
>>>>>> Denis.
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the hotspot-gc-dev mailing list