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