RFR: JDK-8240340: java/lang/management/ThreadMXBean/Locks.java is buggy
Alex Menkov
alexey.menkov at oracle.com
Mon Mar 9 19:15:11 UTC 2020
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