RFR: [XS] 8228658: test GetTotalSafepointTime.java fails on fast Linux machines with Total safepoint time 0 ms
David Holmes
david.holmes at oracle.com
Tue Jul 30 21:35:12 UTC 2019
On 30/07/2019 10:39 pm, Baesken, Matthias wrote:
> Hi David, "put that whole code (the while loop) in a helper method." was JC's idea, and I like the idea .
Regardless I think the way you are using NUM_THREAD_DUMPS is really
confusing. As an all-caps static you'd expect it to be a constant.
Thanks,
David
> Let's see what others think .
>
>>
>> Overall tests like this are not very useful, yet very fragile.
>>
>
> I am also fine with putting the test on the exclude list.
>
> Best regards, Matthias
>
>
>> -----Original Message-----
>> From: David Holmes <david.holmes at oracle.com>
>> Sent: Dienstag, 30. Juli 2019 14:12
>> To: Baesken, Matthias <matthias.baesken at sap.com>; Jean Christophe
>> Beyler <jcbeyler at google.com>
>> Cc: hotspot-dev at openjdk.java.net; serviceability-dev <serviceability-
>> dev at openjdk.java.net>
>> Subject: Re: RFR: [XS] 8228658: test GetTotalSafepointTime.java fails on fast
>> Linux machines with Total safepoint time 0 ms
>>
>> Hi Matthias,
>>
>> On 30/07/2019 9:25 pm, Baesken, Matthias wrote:
>>> Hello JC / David, here is a second webrev :
>>>
>>> http://cr.openjdk.java.net/~mbaesken/webrevs/8228658.1/
>>>
>>> It moves the thread dump execution into a method
>>> executeThreadDumps(long) , and also adds while loops (but with a
>>> limitation for the number of thread dumps, really don’t
>>> want to cause timeouts etc.). I removed a check for
>>> MAX_VALUE_FOR_PASS because we cannot go over Long.MAX_VALUE .
>>
>> I don't think executeThreadDumps is worth factoring out like out.
>>
>> The handling of NUM_THREAD_DUMPS is a bit confusing. I'd rather it
>> remains a constant 100, and then you set a simple loop iteration count
>> limit. Further with the proposed code when you get here:
>>
>> 85 NUM_THREAD_DUMPS = NUM_THREAD_DUMPS * 2;
>>
>> you don't even know what value you may be starting with.
>>
>> But I was thinking of simply:
>>
>> long value = 0;
>> do {
>> Thread.getAllStackTraces();
>> value = mbean.getTotalSafepointTime();
>> } while (value == 0);
>>
>> We'd only hit a timeout if something is completely broken - which is fine.
>>
>> Overall tests like this are not very useful, yet very fragile.
>>
>> Thanks,
>> David
>>
>>> Hope you like this version better.
>>>
>>> Best regards, Matthias
>>>
>>> *From:*Jean Christophe Beyler <jcbeyler at google.com>
>>> *Sent:* Dienstag, 30. Juli 2019 05:39
>>> *To:* David Holmes <david.holmes at oracle.com>
>>> *Cc:* Baesken, Matthias <matthias.baesken at sap.com>;
>>> hotspot-dev at openjdk.java.net; serviceability-dev
>>> <serviceability-dev at openjdk.java.net>
>>> *Subject:* Re: RFR: [XS] 8228658: test GetTotalSafepointTime.java fails
>>> on fast Linux machines with Total safepoint time 0 ms
>>>
>>> Hi Matthias,
>>>
>>> I wonder if you should not do what David is suggesting and then put that
>>> whole code (the while loop) in a helper method. Below you have a
>>> calculation again using value2 (which I wonder what the added value of
>>> it is though) but anyway, that value2 could also be 0 at some point, no?
>>>
>>> So would it not be best to just refactor the getAllStackTraces and
>>> calculate safepoint time in a helper method for both value / value2
>>> variables?
>>>
>>> Thanks,
>>>
>>> Jc
>>>
>>> On Mon, Jul 29, 2019 at 7:50 PM David Holmes <david.holmes at oracle.com
>>> <mailto:david.holmes at oracle.com>> wrote:
>>>
>>> Hi Matthias,
>>>
>>> On 29/07/2019 8:20 pm, Baesken, Matthias wrote:
>>> > Hello , please review this small test fix .
>>> >
>>> > The test
>>>
>> test/jdk/sun/management/HotspotRuntimeMBean/GetTotalSafepointTime.
>> java
>>> fails sometimes on fast Linux machines with this error message :
>>> >
>>> > java.lang.RuntimeException: Total safepoint time illegal value: 0
>>> ms (MIN = 1; MAX = 9223372036854775807)
>>> >
>>> > looks like the total safepoint time is too low currently on these
>>> machines, it is < 1 ms.
>>> >
>>> > There might be several ways to handle this :
>>> >
>>> > * Change the test in a way that it might generate nigher
>>> safepoint times
>>> > * Allow safepoint time == 0 ms
>>> > * Offer an additional interface that gives safepoint times
>>> with finer granularity ( currently the HS has safepoint time values
>>> in ns , see jdk/src/hotspot/share/runtime/safepoint.cpp
>>> SafepointTracing::end
>>> >
>>> > But it is converted on ms in this code
>>> >
>>> > 114jlong RuntimeService::safepoint_time_ms() {
>>> > 115 return UsePerfData ?
>>> > 116
>>> Management::ticks_to_ms(_safepoint_time_ticks->get_value()) : -1;
>>> > 117}
>>> >
>>> > 064jlong Management::ticks_to_ms(jlong ticks) {
>>> > 2065 assert(os::elapsed_frequency() > 0, "Must be non-zero");
>>> > 2066 return (jlong)(((double)ticks /
>>> (double)os::elapsed_frequency())
>>> > 2067 * (double)1000.0);
>>> > 2068}
>>> >
>>> >
>>> >
>>> > Currently I go for the first attempt (and try to generate
>>> higher safepoint times in my patch) .
>>>
>>> Yes that's probably best. Coarse-grained timing on very fast machines
>>> was bound to eventually lead to problems.
>>>
>>> But perhaps a more future-proof approach is to just add a do-while loop
>>> around the stack dumps and only exit when we have a non-zero
>> safepoint
>>> time?
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>> > Bug/webrev :
>>> >
>>> > https://bugs.openjdk.java.net/browse/JDK-8228658
>>> >
>>> > http://cr.openjdk.java.net/~mbaesken/webrevs/8228658.0/
>>> >
>>> >
>>> > Thanks, Matthias
>>> >
>>>
>>>
>>> --
>>>
>>> Thanks,
>>>
>>> Jc
>>>
More information about the serviceability-dev
mailing list