RFR: JDK-8240340: java/lang/management/ThreadMXBean/Locks.java is buggy

David Holmes david.holmes at oracle.com
Mon Mar 9 23:09:21 UTC 2020


Looks good.

Thanks,
David

On 10/03/2020 5:15 am, Alex Menkov wrote:
> 
> Updated webrev:
> http://cr.openjdk.java.net/~amenkov/jdk15/ThreadMXBean_Locks_test/webrev.02/ 
> 
> 
> Changes are in LockFreeLogger comments only.
> 
> --alex
> 
> On 03/08/2020 21:19, David Holmes wrote:
>> P.S.
>>
>> Forgot to note however that you need to update the documentation for 
>> the logger now as the mention of "per-thread logs" makes no sense now. 
>> Also in the spirit of not using @author, and because this is no longer 
>> the code created by Jaroslav, please delete the @author line.
>>
>> Thanks,
>> David
>>
>> On 9/03/2020 2:15 pm, David Holmes wrote:
>>> Hi Alex,
>>>
>>> On 6/03/2020 4:54 am, Alex Menkov wrote:
>>>> Hi David,
>>>>
>>>> Thanks you for the review.
>>>>
>>>> On 03/04/2020 17:50, David Holmes wrote:
>>>>> Hi Alex,
>>>>>
>>>>> On 5/03/2020 10:30 am, Alex Menkov wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> please review the fix for
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8240340
>>>>>> webrev:
>>>>>> http://cr.openjdk.java.net/~amenkov/jdk15/ThreadMXBean_Locks_test/webrev/ 
>>>>>>
>>>>>>
>>>>>> changes:
>>>>>> - assertThreadState method: don't re-read thread state throwing 
>>>>>> exception (as we got weird error like "Thread WaitingThread is at 
>>>>>> WAITING state but is expected to be in Thread.State = WAITING");
>>>>>> - added proper test shutdown on error (made all threads "daemon", 
>>>>>> interrupt waiting thread if CheckerThread throws exception);
>>>>>> - if CheckerThread detects error, propagate the exception to main 
>>>>>> thread;
>>>>>
>>>>> The test changes seem fine.
>>>>>
>>>>>> - fixed LockFreeLogger class - it should work for logging from 
>>>>>> several threads, but it doesn't. I prefer to simplify it just to 
>>>>>> keep ConcurrentLinkedQueue<String>.
>>>>>> LockFreeLogger is also used by ThreadMXBeanStateTest test, but 
>>>>>> only by a single thread.
>>>>>
>>>>> I don't understand your changes here as you've completely changed 
>>>>> the intended design of the logger. The original accumulates log 
>>>>> entries per-thread and then spits them all out (though I'm not 
>>>>> clear on the exact ordering - I don't how to read that stream 
>>>>> stuff). The new code just creates a single queue of log records 
>>>>> interleaving entries from different threads. The simple logger may 
>>>>> be all that is needed but it seems quite different to the intent of 
>>>>> the original.
>>>>
>>>> Testing changes in the test I discovered that there is something 
>>>> wrong with the logger - it printed only part of the records, so I 
>>>> have to look at the LockFreeLogger class and I don't understand how 
>>>> it was supposed to work.
>>>> About ordering in cumulative log: each record has Integer which used 
>>>> to sort log entries from all threads (i.e. records from different 
>>>> threads are printed at the order which log() was called).
>>>> Looking at allRecords/records stuff I don't understand how it should 
>>>> be used. To get logs from different threads in one logger, we needs 
>>>> one instance. So we create LockFreeLogger (in main thread) and ctor 
>>>> creates ThreadLocal record and register it in allRecords. Logging 
>>>> from main thread works fine, but if any other thread tries to log, 
>>>> 1st log() call creates its own ThreadLocal records (by 
>>>> records.get()) and log records from this thread go there. But this 
>>>> ThreadLocal records is not registered in allRecords, so this logging 
>>>> won't be included in final log.
>>>> Looks like we need to change log() to something like
>>>>
>>>> Map<Integer, String> recs = records.get();
>>>> if (recs.isEmpty()) {
>>>>      allRecords.add(recs);
>>>> }
>>>> recs.put(id, String.format(format, params));
>>>
>>> Yep good catch - this logger was completely broken.
>>>
>>>> But all this stuff do exactly the same as simple 
>>>> ConcurrentLinkedQueue (i.e. lock free ordered list).
>>>> At least I don't see other rationale in the stuff.
>>>
>>> I'm not certain of intent with the original but I'd always want to 
>>> see log entries in chronological order - which is what we now clearly 
>>> have.
>>>
>>> Thanks,
>>> David
>>>
>>>> --alex
>>>>
>>>>>
>>>>> Thanks,
>>>>> David
>>>>>
>>>>>> --alex


More information about the serviceability-dev mailing list