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>