RFR: 7152183: TEST_BUG: java/lang/ProcessBuilder/Basic.java failing intermittently [sol]

Rob McKenna rob.mckenna at oracle.com
Sun Oct 7 19:48:16 UTC 2012


Thanks Martin,

I've uploaded a new webrev to:

http://cr.openjdk.java.net/~robm/7152183/webrev.02/ 
<http://cr.openjdk.java.net/%7Erobm/7152183/webrev.02/>

Let me know if this does the job.

     -Rob

On 04/10/12 18:24, Martin Buchholz wrote:
> Hi all,
>
> Yeah, this particular test is rather racy - sorry about that.
> We need to call p.destroy when the other thread is in the middle of a 
> read() system call, and there's no way to know for sure - seeing java 
> "read" in the stacktrace is not enough, since it may not have gotten 
> to the system call yet.
>
> suggestions:
> pull the computation of the inputstream before the latch to narrow the 
> window a bit:
>
> final InputStream s;
> switch (action & 0x1) {
> case 0: s = p.getInputStream(); break;
> case 1: s = p.getErrorStream(); break;
> default: throw
> }
> latch.countdown();
> switch (action & 0x2) {
> case 0: r = s.read(); break;
> case 1: r = s.read(bytes); break;
> }
>
> Examining the stack trace to look for "read" is clever but does not 
> actually eliminate the race.
>
> Looking in UNIXProcess.java.solaris I see the use 
> of DeferredCloseInputStream.  We can eliminate the race on solaris 
> (i.e. if the inputstream.getclass isDeferredCloseInputStream)  by 
> looping until the useCount field of the DeferredCloseInputStream is > 
> 0, using ugly but effective reflective code.  This should allow us to 
> avoid the horrible sleep for 200ms.
>
> You should use yield instead of sleep between loop iterations while 
> waiting for the useCount to be bumped.
>
> On other platforms this is not an issue, I think.
>
> Martin
>
> On Thu, Oct 4, 2012 at 12:39 AM, Alan Bateman <Alan.Bateman at oracle.com 
> <mailto:Alan.Bateman at oracle.com>> wrote:
>
>     On 03/10/2012 22:44, Rob McKenna wrote:
>
>         Hi folks,
>
>         The only way I can see this test failing in this manner[*] is
>         if we destroy the process before we begin the read. That being
>         the case I've jacked up the sleep (giving the reader thread a
>         little more time to get cracking) and added a check to see if
>         the threads stack has entered a read call.
>
>         http://cr.openjdk.java.net/~robm/7152183/webrev.01/
>         <http://cr.openjdk.java.net/%7Erobm/7152183/webrev.01/>
>         <http://cr.openjdk.java.net/%7Erobm/7152183/webrev.01/>
>
>         Feedback greatly appreciated.
>
>             -Rob
>
>
>         [*] le trace:
>
>     So stack traces are masculine, I didn't know that.
>
>     I think your analysis is right, it's just that the sleep(10) is
>     not sufficient to ensure that the thread gets to the read method.
>     Increasing the sleep is probably sufficient. The hack to look at
>     the stack trace makes it more robust for really extreme cases, at
>     the cost of potential further maintenance in the event that the
>     implementation changes. In any case it's good to resolve this
>     intermittent test failure.
>
>     -Alan
>
>




More information about the core-libs-dev mailing list