RFR: JDK-8224642: Test sun/tools/jcmd/TestJcmdSanity.java fails: Bad file descriptor
Langer, Christoph
christoph.langer at sap.com
Wed Jun 19 12:14:44 UTC 2019
Hi Gary,
looks good overall. I however think the block should also be synchronized to avoid issues when multiple threads attempt to close the stream.
Cheers
Christoph
> -----Original Message-----
> From: Gary Adams <gary.adams at oracle.com>
> Sent: Mittwoch, 19. Juni 2019 13:59
> To: Langer, Christoph <christoph.langer at sap.com>
> Cc: OpenJDK Serviceability <serviceability-dev at openjdk.java.net>;
> Schmelter, Ralf <ralf.schmelter at sap.com>
> Subject: Re: RFR: JDK-8224642: Test sun/tools/jcmd/TestJcmdSanity.java
> fails: Bad file descriptor
>
> I think everyone is in agreement now that preventing the double close
> is the best way to handle this failure. If there are no further comments,
> I'll push the attached patch on Thurs morning to the jdk/jdk repos.
>
> I'll also close JDK-8223361 as a duplicate.
>
> On 6/19/19, 2:36 AM, Langer, Christoph wrote:
> > Hi Gary,
> >
> > I think overall it would be better to fix the InputStream to be tolerant to
> multiple calls to close, as Ralf pointed out. Maybe someone else on some
> other place runs into this again because he/she relies on the correct
> implementation of Closeable.
> >
> > However, as a quick fix I can also imagine to do use a single resource like
> this:
> >
> > try (InputStreamReader isr = new
> InputStreamReader(hvm.executeJCmd(line), "UTF-8")) {
> >
> > Then we'd also have a single close call per instance.
> >
> > But if you do that, you should at least open a bug to track fixing of the
> InputStream implementation...
> >
> > Best regards
> > Christoph
> >
> >> -----Original Message-----
> >> From: serviceability-dev<serviceability-dev-bounces at openjdk.java.net>
> On
> >> Behalf Of gary.adams at oracle.com
> >> Sent: Dienstag, 18. Juni 2019 12:08
> >> To: OpenJDK Serviceability<serviceability-dev at openjdk.java.net>
> >> Subject: RFR: JDK-8224642: Test sun/tools/jcmd/TestJcmdSanity.java fails:
> >> Bad file descriptor
> >>
> >> The workaround below passed 1000 testruns on linux-x64-debug.
> >>
> >> A more localized fix simply moves the stream reader out of the
> >> try with resources, so only one close is applied to the underlying
> >> socket. I'll run this test through 1000 testruns today.
> >>
> >> Looking for a final review for this change.
> >>
> >> diff --git a/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java
> >> b/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java
> >> --- a/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java
> >> +++ b/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java
> >> @@ -122,8 +122,8 @@
> >> if (line.trim().equals("stop")) {
> >> break;
> >> }
> >> - try (InputStream in = hvm.executeJCmd(line);
> >> - InputStreamReader isr = new InputStreamReader(in,
> >> "UTF-8")) {
> >> + try (InputStream in = hvm.executeJCmd(line)) {
> >> + InputStreamReader isr = new InputStreamReader(in, "UTF-8");
> >> // read to EOF and just print output
> >> char c[] = new char[256];
> >> int n;
> >>
> >> On 6/17/19 3:23 PM, Gary Adams wrote:
> >>> https://bugs.openjdk.java.net/browse/JDK-8224642
> >>>
> >>> I may have a handle on what is going wrong with the
> >>> TestJcmdSanity test and the bad file descriptor.
> >>>
> >>> A change made in April 2019 placed the input stream and reader
> >>> within the same try with resources block. This has the effect of
> >>> calling the
> >>> SocketInputStream close method twice for each command processed.
> >>>
> >>> https://bugs.openjdk.java.net/browse/JDK-8222491
> >>> http://hg.openjdk.java.net/jdk/jdk/rev/4224f26b2e7f
> >>>
> >>> The last set of tests in the TestJcmdSanity test attempts to process ~100
> >>> VM.version commands in a loop. Since the closes are handled
> >>> when the objects are collected it may come at an inopportune time.
> >>>
> >>> I'm testing the fix below to ensure a second close becomes a noop.
> >>> It may be better to revisit the earlier change that set up the double
> >>> close calls.
> >>>
> >>> diff --git
> >>> a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
> >>>
> b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
> >>> ---
> >>> a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
> >>> +++
> >>>
> b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
> >>> @@ -233,7 +233,7 @@
> >>> * InputStream for the socket connection to get target VM
> >>> */
> >>> private class SocketInputStream extends InputStream {
> >>> - int s;
> >>> + int s = -1;
> >>>
> >>> public SocketInputStream(int s) {
> >>> this.s = s;
> >>> @@ -261,7 +261,10 @@
> >>> }
> >>>
> >>> public void close() throws IOException {
> >>> + if (s != -1) {
> >>> VirtualMachineImpl.close(s);
> >>> + s = -1;
> >>> + }
> >>> }
> >>> }
More information about the serviceability-dev
mailing list