I agree with Jaroslav here, and would like a different patch. The proposed patch does not solve the problem and as a debugging help it is implemented at the wrong level. I think the ProcessTools.getOutput() should be updated to throw the InterruptedException - this looks wrong in the library. The impact on other tests should be minimal, I don’t believe anyone depends on getOutput() swallowing InterruptedException - if they do, we have to fix that, too (which at the same time would make those tests more stable).
Thanks, /Staffan On 2 jul 2014, at 10:05, shanliang <shanliang.ji...@oracle.com> wrote: > Jaroslav Bachorik wrote: >> On 07/01/2014 11:40 PM, shanliang wrote: >>> Jaroslav Bachorik wrote: >>>> Hi Shanliang, >>>> >>>> On 07/01/2014 09:47 PM, shanliang wrote: >>>>> I am still thinking to keep the original fix, because: >>>>> 1) to throw InterruptedException does not fix the test failure, it might >>>>> give more info for diagnostics. If it was really caused by an >>>>> InterruptedException, then to fix the issue we still need to know who >>>>> could interrupt the test main thread, in which case and why, and whether >>>>> possible to ignore it (skip the test or try again?). >>>> >>>> I'm sorry but I can't agree with this. The proposed patch does not add >>>> anything else than making the InterruptedException visible. Adding >>>> process.waitFor() will solve nothing as it is already called by >>>> ProcessTools.getOutput(process) while creating OutputAnalyzer. >>>> >>>>> 2) the test library is used also by other tests and to modify it might >>>>> make new fail, it is better to concentrate at first on a single test >>>>> before knowing the exact cause. >>>> >>>> I wouldn't expect new failures - when an InterruptedException was >>>> thrown the ProcessTools.executeTestJvm(args) returned null. Either the >>>> test would fail with NPE or custom assert - it makes no sense to work >>>> with "null" process. >>>> >>>> IMO, this should be fixed in the test library. >>> Sorry I may miss something here, you suggested: >>> "Either the result of ProcessTools.getOutput() should be checked for >>> null to detect this situation or ProcessTools.getOutput() should throw a >>> more aggressive exception when waitFor() gets interrupted." >>> >>> We still need to do something when an InterruptedException happens, skip >>> the test or retry? before making a decision we should know why there was >>> an InterruptedException and in which case, I really do not have any >>> idea, and I do not want to exclude other possibilities. >> >> The most probable explanation, based on the analysis of many intermittent >> test failures, is that the harness is trying to time out the test. But it is >> just an educated guess ... > Thought about this possibility, but a harness would kill the test instead to > interrupt the test thread? >> >>> >>> Yes what my fix does is to expose an InterruptedException if it happens, >>> but it could make sure that it was really because of an >>> InterruptedException. >> >> I don't feel particularly happy about the code duplication introduced by >> this fix. But if official reviewers are fine with it I won't block this >> review. >> >>> >>> About new failure, there could be a negative test which expected a >>> IllegalStateException --> failed OutputAnalyser, who knows. >> >> My concern is that there also might be other tests failing intermittently >> (or providing wrong results) due to the InterruptedException being silently >> swallowed. > I agree that we need to do investigation on the test library, but better to > do it later when we have more info from this test. > > Thanks, > Shanliang >> >> You might run the whole testsuite with the modified ProcessTools.getOutput() >> on JPRT and see if there are any negative tests failing (they should since >> instead of null value they will receive InterryptedException). >> >> -JB- >> >>> >>> Shanliang >>>> >>>> -JB- >>>> >>>>> >>>>> Shanliang >>>>> >>>>> Christian Tornqvist wrote: >>>>>> >>>>>> I can’t remember if there was a reason for doing it like this, but it >>>>>> seems reasonable to not catch the InterruptedException in getOutput(). >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Christian >>>>>> >>>>>> *From:*Staffan Larsen [mailto:staffan.lar...@oracle.com] >>>>>> *Sent:* Friday, June 27, 2014 4:49 AM >>>>>> *To:* shanliang >>>>>> *Cc:* Jaroslav Bachorik; serviceability-dev@openjdk.java.net >>>>>> serviceability-dev@openjdk.java.net; Christian Tornqvist >>>>>> *Subject:* Re: RFR JDK-8031554: com/sun/tools/attach/BasicTests.java >>>>>> fails intermittently >>>>>> >>>>>> It does look suspicious to catch and ignore the InterruptedException, >>>>>> especially since the OutputAnalyzer constructor will fail in this case. >>>>>> >>>>>> Christian is the original author of these classes: do you know if >>>>>> there is a good rationale for doing this? Or should we propagate the >>>>>> InterruptedException? >>>>>> >>>>>> Thanks, >>>>>> >>>>>> /Staffan >>>>>> >>>>>> On 26 jun 2014, at 17:24, shanliang <shanliang.ji...@oracle.com >>>>>> <mailto:shanliang.ji...@oracle.com>> wrote: >>>>>> >>>>>> >>>>>> >>>>>> Jaroslav Bachorik wrote: >>>>>> >>>>>> Hi Shanliang, >>>>>> >>>>>> On 06/26/2014 03:15 PM, shanliang wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> Today ProcessTools.executeProcess has the code: >>>>>> new OutputAnalyzer(pb.start()); >>>>>> >>>>>> and OutputAnalyzer constructor calls immediately: >>>>>> exitValue = process.exitValue(); >>>>>> >>>>>> the test got exception because the process did not end. >>>>>> >>>>>> >>>>>> Are you sure about this? >>>>>> >>>>>> The OutputAnalyzer constructor, before calling >>>>>> process.exitValue(), calls ProcessTools.getOutput(process) >>>>>> which actually does process.waitFor() >>>>>> >>>>>> Good catch! >>>>>> >>>>>> >>>>>> A probable explanation would be that process.waitFor() gets >>>>>> interrupted without the target process actually ending. >>>>>> >>>>>> Either the result of ProcessTools.getOutput() should be >>>>>> checked for null to detect this situation or >>>>>> ProcessTools.getOutput() should throw a more aggressive >>>>>> exception when waitFor() gets interrupted. >>>>>> >>>>>> It was possible beacause of an InterruptedException, but maybe a >>>>>> Process issue too. >>>>>> >>>>>> process.waitFor() was called by the test main thread, I am >>>>>> wondering who wanted to interrupt this thread? >>>>>> >>>>>> Not know why ProcessTools.getOutput() catches InterruptedException >>>>>> and then returns null, are there some other tests dependent to >>>>>> this behavior? otherwise better to not catch InterruptedException. >>>>>> >>>>>> I think to keep this modification, it will allow us to get more >>>>>> information if the bug is reproduced, if getting an >>>>>> InterruptedException then we need to do more investigation for >>>>>> why, if no exception then we may rise a question to >>>>>> process.waitFor(). >>>>>> >>>>>> Shanliang >>>>>> >>>>>> >>>>>> -JB- >>>>>> >>>>>> >>>>>> >>>>>> So a direct solution for the test is not to call: >>>>>> ProcessTools.executeTestJvm(args); >>>>>> >>>>>> but: >>>>>> ProcessBuilder pb = >>>>>> ProcessTools.createJavaProcessBuilder(Utils.addTestJavaOpts(args)); >>>>>> Process process = pb.start(); >>>>>> process.waitFor(); >>>>>> OutputAnalyzer output = new >>>>>> OutputAnalyzer(process); >>>>>> >>>>>> here we do waiting: >>>>>> process.waitFor(); >>>>>> before constructing an OutputAnalyzer. >>>>>> >>>>>> ProcessTools is a tool class we may have same issue for >>>>>> other tests >>>>>> using this class. So we may need to improve the test >>>>>> library. >>>>>> >>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8031554 >>>>>> webrev: http://cr.openjdk.java.net/~sjiang/JDK-8031554/00/ >>>>>> <http://cr.openjdk.java.net/%7Esjiang/JDK-8031554/00/> >>>>>> >>>>>> >>>>>> Thanks, >>>>>> Shanliang