Fwd: Patch: Clean up fix for JDK-8047720
Daniel D. Daugherty
daniel.daugherty at oracle.com
Tue Feb 17 18:34:31 UTC 2015
Carsten,
I believe I have all the changes that you recommended in your
better.patch file. Not 100% byte-for-byte, but I think we're
covered.
Dan
On 2/17/15 11:09 AM, Carsten Varming wrote:
> 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 <mailto: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 <mailto: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 <mailto: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>
>> <mailto: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/462690ee/attachment.html>
More information about the serviceability-dev
mailing list