Fwd: Patch: Clean up fix for JDK-8047720
Carsten Varming
varming at gmail.com
Tue Feb 17 18:09:08 UTC 2015
Dear Daniel,
Great news.
I was reading your comments on JDK-8072439 and just want to point out the
other race that my patch fixed:
WatcherThread::run sees !_should_terminate, and calls sleep.
WatcherThread::stop takes PeriodicTask_lock, sets _should_terminate, notify
PeriodicTask_lock, and release the lock. Sleep wait forever on
PeriodicTask_lock. Notice that the wait forever happens only if there are
no periodic tasks scheduled, so this might not be reproducible (even with
suitable sleeps), yet it is a lurking bug.
Let me know if there is anything I can do to help,
Carsten
On Tue, Feb 17, 2015 at 12:43 PM, Daniel D. Daugherty <
daniel.daugherty at oracle.com> wrote:
> Carsten.
>
> I've started diving into this issue. Please see the updates
> that I've been making to:
>
> JDK-8072439 fix for 8047720 may need more work
> https://bugs.openjdk.java.net/browse/JDK-8072439
>
> Dan
>
>
> On 2/10/15 3:18 PM, Carsten Varming wrote:
>
> Dear David,
>
> Any news regarding this fix? Anything I can do to help?
>
> Best wishes,
> Carsten
>
> On Wed, Feb 4, 2015 at 12:54 PM, Carsten Varming <varming at gmail.com>
> wrote:
>
>> Dear David,
>>
>> I took a look at all occurrences of PeriodicTask_lock. We are in luck:
>>
>> PeriodicTask::enroll and PeriodicTask::disenroll check for safepoints
>> when acquiring PeriodicTask_lock.
>>
>> PeriodicTask::time_to_wait and PeriodicTask::real_time_tick are called
>> only by the watcher thread.
>>
>> WatcherThread::unpark is used only in contexts where PeriodicTask_lock
>> is owned by the caller.
>>
>> WatcherThread::sleep is called only by the watcher thread.
>>
>> I took another look at WatcherThread::sleep and realized that there is
>> a path from acquiring PeriodicTask_lock to waiting on the lock where
>> _should_terminate is not checked. I added that to the minimal fix attached.
>>
>> Looking at these methods made me want to clean up a little more. See
>> better.patch attached.
>>
>> I feel pretty good about the patch with the limited usage of
>> no_safepoint_check_flag with PeriodicTask_lock.
>>
>> Carsten
>>
>>
>> On Tue, Feb 3, 2015 at 11:28 PM, David Holmes <david.holmes at oracle.com>
>> wrote:
>>
>>> On 4/02/2015 1:28 PM, Carsten Varming wrote:
>>>
>>>> Dear David Holmes,
>>>>
>>>> Please see inline response,
>>>>
>>>> On Tue, Feb 3, 2015 at 9:38 PM, David Holmes <david.holmes at oracle.com
>>>> <mailto:david.holmes at oracle.com>> wrote:
>>>>
>>>> On 4/02/2015 5:00 AM, Carsten Varming wrote:
>>>>
>>>> Greetings all,
>>>>
>>>> I was recently introduced to the deadlock described in
>>>> JDK-8047720 and
>>>> fixed in JDK9. The fix seems a little messy to me, and it looks
>>>> like it
>>>> left some very short races in the code. So I decided to clean
>>>> up the
>>>> code. See attached diff.
>>>>
>>>> The change takes a step back and acquires PeriodicTask_lock in
>>>> WatcherThread::stop (like before the fix in JDK9), but this time
>>>> safepoints are allowed to proceed when acquiring
>>>> PeriodicTask_lock,
>>>> preventing the deadlock.
>>>>
>>>>
>>>> It isn't obvious that blocking for a safepoint whilst in this method
>>>> will always be a safe thing to do. That would need to be examined in
>>>> detail - potential interactions can be very subtle.
>>>>
>>>>
>>>> Absolutely true. For reference, the pattern is repeated with the
>>>> Terminator_lock a few lines below. The pattern is also used in
>>>> Threads::destroy_vm before and after calling before_exit, and the java
>>>> shutdown hooks are called right before the call to before_exit. So there
>>>> is a lot of evidence that safepoints are allowed to happen in this
>>>> context.
>>>>
>>>
>>> The thread calling before_exit is a JavaThread so of course it
>>> participates in safepoints. The issue is whether the interaction between
>>> that thread and the WatcherThread, via the PeriodicTask_lock, can allow for
>>> the JavaThread blocking at a safepoint whilst owning that lock. If another
>>> JavaThread can try to lock it without a safepoint check then we can get a
>>> deadlock.
>>>
>>> Cheers,
>>> David
>>>
>>>
>>> Thank you for taking your time to look at this,
>>>> Carsten
>>>>
>>>>
>>>> David
>>>>
>>>>
>>>> Let me know what you think,
>>>> Carsten
>>>>
>>>>
>>>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20150217/bc33289c/attachment-0001.html>
More information about the serviceability-dev
mailing list