RFR(XS): 8167001: [TESTBUG] java/lang/instrument/DaemonThread/TestDaemonThread.java fails when run by jprt

Jonathan Gibbons jonathan.gibbons at oracle.com
Tue Oct 4 22:30:18 UTC 2016


Chris, Serguei,

CLASSPATH is used in othervm mode for historical reasons, and includes 
the test-specific classes.

Environment variables cannot be modified during execution, and so cannot 
contain test-specific classes in agent mode, since the agent VM is 
reused for different tests. Therefore although the env variable is set, 
it doesn't (cannot) include test classes.

As a general technique for both the launcher and for javac, I recommend 
avoiding environment variables like CLASSPATH, and using options like 
-cp/-classpath.

-- Jon

On 10/04/2016 02:33 PM, Chris Plummer wrote:
> Hi Serguei,
>
> Yes, adding othervm also fixes the problem. What also works is adding 
> the following VM arguments when calling createJavaProcessBuilder().:
>
>     "-cp", System.getProperty("test.class.path")
>
> or
>
>     "-cp", System.getProperty("java.class.path")
>
> I've seen the above used, othervm used, and relying on 
> ProcessTools.createJavaProcessBuilder() to add the classpath, either 
> implicitly as is done by default in hotspot/test, or explicitly by 
> passing true as the first arg as is done in jdk/test.
>
> My preferences is the createJavaProcessBuilder() approach. I worry 
> that othervm is relying on a side affect of its use, and is not on a 
> direct solution to the problem. I still haven't gotten an explanation 
> as to why othervm causes CLASSPATH to be exported, and agentvm causes 
> -classpath to be used instead. Using the createJavaProcessBuilder() 
> approach will continue to work even if othervm stopped exporting 
> CLASSPATH.
>
> thanks,
>
> Chris
>
> On 10/4/16 2:18 PM, serguei.spitsyn at oracle.com wrote:
>> Hi Chris,
>>
>> It looks good to me.
>> But I have a question.
>> Would it also work if we add "othervm" to the test 
>> TestDaemonThread.java?
>> It seems other j.l.i tests are run in this mode.
>>
>> Thanks,
>> Serguei
>>
>>
>> On 10/4/16 10:43, Chris Plummer wrote:
>>> Hello,
>>>
>>> Please review the following:
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8167001
>>> http://cr.openjdk.java.net/~cjplummer/8167001/webrev.00/webrev.jdk/
>>>
>>> This fixes an issue with the classpath not being passed to the 
>>> subprocess, resulting in the main class for the subprocess not being 
>>> found. It only turns up when running the test with "agentvm", which 
>>> is the default when running the test via test/Makefile (which is 
>>> what jprt uses). "othervm" seems to be the default when running 
>>> jtreg directly from the command line, so it doesn't see this problem.
>>>
>>> Although there are still ongoing discussion of jtreg classpath 
>>> definition differences between "agentvm" mode and "othervm" mode, 
>>> existing tests fix this issue by explicitly passing the classpath to 
>>> the subprocess. This is usually done by passing "true" as the first 
>>> argument to ProcessTools.createJavaProcessBuilder(), so I'd like to 
>>> go with this fix for now. This is actually the default behavior for 
>>> hotspot/test. For jdk/test the default is "false" so you need to 
>>> explicitly pass "true".
>>>
>>> Tested by running with jprt under conditions where the test was 
>>> previously failing. Also tested by running the test directory 
>>> locally using jdk/Makefile (which previously was failing).
>>>
>>> thanks,
>>>
>>> Chris
>>
>



More information about the jtreg-dev mailing list