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

Alex Menkov alexey.menkov at oracle.com
Mon Mar 9 18:34:31 UTC 2020



On 03/06/2020 23:28, serguei.spitsyn at oracle.com wrote:
> Hi David and Alex,
> 
> My understanding is that previous implementation collected logs 
> separately for each thread in TLS, and at the end, merged and sorted out 
> the output by log id.
> So, the result is that all messages are serialized at the end.
> Alex changed the implementation but the result is the same - all log 
> messages are serialized.
> 
> There are two tests which use the LockFreeLogger.
> Another one is: test/jdk/java/lang/Thread/ThreadStateController.java .
> Does the ThreadStateController.java work okay after the fix?

ThreadStateController is an utility class used only by 
ThreadMXBeanStateTest.java.
ThreadMXBeanStateTest.java is problem-listed, but I verified that 
logging works in the test.

--alex


> 
> Thanks,
> Serguei
> 
> 
> On 3/5/20 10:54, 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));
>>
>> 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.
>>
>> --alex
>>
>>>
>>> Thanks,
>>> David
>>>
>>>> --alex
> 


More information about the serviceability-dev mailing list