Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Apr 2017 17:28:12 -0500
From:      Eric van Gyzen <eric@vangyzen.net>
To:        redraiment@gmail.com, freebsd-java@freebsd.org
Cc:        Konstantin Belousov <kostikbel@gmail.com>
Subject:   Re: OpenJDK8 Thread.sleep will deadlock while turn down system date time.
Message-ID:  <a48038a5-3f12-f7ef-9e94-6c33b4672c02@vangyzen.net>
In-Reply-To: <20170408070340.GD1788@kib.kiev.ua>
References:  <CAPRzLQSOfySJWqN8CoLNchRs_JgHkeQz57ZNB9E__Meip3zmOQ@mail.gmail.com> <20170408070340.GD1788@kib.kiev.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
On 4/8/17 2:03 AM, Konstantin Belousov wrote:
> On Fri, Apr 07, 2017 at 08:12:42PM -0700, ????????? wrote:
>> Hi all,
>>
>> I found a Java process deadlock issue, and can be reproduced in FreeBSD
>> 10.3 and 11.0 .
>>
>> My environment:
>>
>> * VirutalBox 5.1.16 r113841 on Mac OS X 10.12.4
>> * FreeBSD-11.0-RELEASE-amd64.vhd.xz
>>
>> Reproduction steps:
>>
>> 1. install openjdk8
>>
>> ```sh
>> pkg install openjdk8
>> ```
>>
>> 2. Java source code
>>
>> ```java
>> public class Main {
>>      public static void main(String[] args) {
>>          while (true) {
>>              System.out.println("tick");
>>              Thread.sleep(3000);
>>          }
>>      }
>> }
>> ```
>>
>> 3. Run java
>>
>> ```sh
>> $ javac Main.java
>> $ java Main
>> tick
>> tick
>> ...
>> ```
>>
>> 4. Turn down system date time.
>>
>> ```sh
>> $ date '+%Y-%m-%d %H:%M:%S'
>> 20170408 11:09:11
>> $ date 201001010000
>> Fri Jan  1 00:00:00 CST 2010
>> ```
>>
>> Then, the java process will hung.
> Hang != deadlock, why do you claim that the process deadlocked.
>>
>> The issue will reproduce while turn "DOWN" the date time. It's OK while
>> turn up the date time.
> 
> If JVM sets timeouts using absolute times than it might be fixed in latest
> HEAD and stable/11.

The JVM uses pthread_cond_timedwait() to implement Thread.sleep(), so it 
always uses absolute times.  Furthermore, it uses the default clock, 
CLOCK_REALTIME.  My recent change (r315280) does not fix this behavior; 
in fact, I believe it will make the problem worse, since moving the 
clock forward will wake the thread prematurely.

I think the JVM should be fixed to use CLOCK_MONOTONIC.  Would someone 
like to do the research to determine the correct behavior of 
Thread.sleep()?  Specifically, should the duration of the sleep be 
affected by adjustments to the real-time clock?  I expect that it should 
/not/ be affected, especially since the API takes a relative/interval 
time.  Ideally, we would find the answer in the formal language 
specification; failing that, I would be satisfied with empirical data 
from testing on Windows, Linux, MacOS, and Solaris.  I'll be happy to 
write a patch once we know what it should do.

Please keep me CC'd, since I'm not on freebsd-java@.  (Thanks for the 
CC, Kostik.)

Eric



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?a48038a5-3f12-f7ef-9e94-6c33b4672c02>