Hi Sharath, Ah, I see: it is the call to System.exit() that is causing readLine to return. That makes sense, and I now understand the fix.
Reviewed. Thanks, /Staffan > On 28 apr. 2016, at 10:25, Sharath Ballal <sharath.bal...@oracle.com> wrote: > > Hi Staffan, > The root cause of this problem is that BufferedReader.readLine() is > intermittently returning 'null' during System.exit(0). > > In TTY.java:751 we are always blocking on readLine(). Whenever a user enters > a command in JDB, the readLine() returns the command, which gets executed. > This is running in the 'main' thread. > > When JDB is done, as part of the shutdown it calls System.exit() at > Env.java:92 in a different thread 'event-handler'. > > Usually (in the passing cases) calling System.exit() is the end of the > process and readLine() doesn't return 'null', but in the failing case > readLine() at TTY.java:751 returns 'null'. This causes the string "Input > stream closed." to be printed. The jtreg testcase looks for this string to > decide that the testcase failed. > > The fix I have done is avoiding the print because we know that we are > shutting down and hence can discard the ‘null’ returned by readLine(). > > Regarding the testing, I have run few of the failing jtreg testcases about > 200 times and not seen the problem (earlier I was able to recreate without > the fix). I have to do other tests, but sent for review to do it in parallel. > > jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/TTY.java > > 708 BufferedReader in = > 709 new BufferedReader(new InputStreamReader(System.in)); > ....... > ....... > 748 // Process interactive commands. > 749 MessageOutput.printPrompt(); > 750 while (true) { > 751 String ln = in.readLine(); > 752 if (ln == null) { > 753 MessageOutput.println("Input stream closed."); > 754 ln = "quit"; > 755 } > > jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/Env.java > > 79 static void shutdown(String message) { > 80 if (connection != null) { > 81 try { > 82 connection.disposeVM(); > 83 } catch (VMDisconnectedException e) { > 84 // Shutting down after the VM has gone away. This is > 85 // not an error, and we just ignore it. > 86 } > 87 } > 88 if (message != null) { > 89 MessageOutput.lnprint(message); > 90 MessageOutput.println(); > 91 } > 92 System.exit(0); > 93 } > > > -Sharath Ballal > > > From: Staffan Larsen > Sent: Thursday, April 28, 2016 1:17 PM > To: Sharath Ballal > Cc: serviceability-dev@openjdk.java.net > Subject: Re: RFR: JDK-8154144 Tests in com/sun/jdi fails intermittently with > "jdb input stream closed prematurely > > Hi Sharath, > > Can you explain more how this help with the problem in the bug? > > It looks like you are trying to avoid a race by not printing the "Input > stream closed.” message while shutting down. You added this: > 136 ((TTY)notifier).setShuttingDown(true); > 137 Env.shutdown(shutdownMessageKey); > The call on line 137 will result in a System.exit(0) call if I am reading the > code right. So adding the shutdown flag to line 136 will maybe make the race > smaller, but isn’t really solving it? > > What kind of testing have you run this fix through? > > Thanks, > /Staffan > > > > On 28 apr. 2016, at 09:22, Sharath Ballal <sharath.bal...@oracle.com > <mailto:sharath.bal...@oracle.com>> wrote: > > Hi, > > Pls review the change for bug > > JDK-8154144 <https://bugs.openjdk.java.net/browse/JDK-8154144> - Tests in > com/sun/jdi fails intermittently with "jdb input stream closed prematurely > > Webrev: > http://cr.openjdk.java.net/~sballal/8154144/webrev.00/ > <http://cr.openjdk.java.net/~sballal/8154144/webrev.00/> > > -Sharath Ballal