RFR: JDK-8213214: Set -Djava.io.tmpdir= when running tests

Erik Joelsson erik.joelsson at oracle.com
Wed Jun 17 13:47:46 UTC 2020


On 2020-06-17 01:24, Alan Bateman wrote:
> On 16/06/2020 18:44, Erik Joelsson wrote:
>> There are a lot of jtreg tests that use temporary files. These 
>> temporary files add up over time and fill up the global temp 
>> directories on our test systems. To tackle this, we should try to 
>> redirect these temporary files into a directory controlled by the 
>> test framework. Jtreg does not do this, but we can set 
>> -Djava.io.tmpdir from RunTest.gmk. This will not prevent all temp 
>> files from being created outside of the work dir, but at least most.
>>
>> I have found one test where this becomes an issue, 
>> java/nio/file/Path/Misc.java on Windows when running in elevated mode 
>> with the workspace on a subst drive. This looks like an actual issue 
>> in the product, so I have filed a separate bug for it [1]. Since we 
>> currently use subst in our distributed test system to get around 
>> Windows path length issues, we are hitting this problem. While the 
>> bug is being evaluated, I have implemented a workaround in the test 
>> so that it is able to handle the known situation. I would like to 
>> have someone from core-libs look at the workaround.
>>
>> Webrev: http://cr.openjdk.java.net/~erikj/8213214/webrev.01/
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8213214
> subst is a legacy mechanism. We know from previous attempts to 
> reconcile usage of subset with NTFS symbolic links creates surprises 
> and inconsistencies. I don't object to putting a workaround in the 
> test but I think more information is required, in particular the 
> comment that 'file' is guaranteed to be subst free? Can you expand on 
> this? Some examples would be useful as it's not clear how subst is 
> used in the environment, is it solely that java.io.tmpdir is set to 
> something like S:\tmp and S: is mapped to some other location?
>
The following code breaks if file refers to a path on a subst drive.

Path file = Files.createFile(dir.resolve("foo"));
Path link = dir.resolve("link");
Files.createSymbolicLink(link, file.toAbsolutePath());
assertTrue(link.toRealPath(NOFOLLOW_LINKS).getFileName().equals(link.getFileName()));

In our case, this is caused by having a workspace in d:/X/Y/Z/workspace 
and having run something like "subst t: d:/X/Y/Z" before invoking the 
"make test" command in "t:/workspace". We currently need that subst to 
shorten path lengths because the X/Y/Z is a very deep path outside of 
our control. (We are looking into other solutions to this, but may not 
be able to apply them universally) Currently java.io.tmpdir is pointing 
to the default location, so the test passes, but if I explicitly set 
java.io.tmpdir to point into a subdir of the workspace (which is what 
this patch is about), then we trigger this failure.

I have stepped through the various variants of calls to 
Path::toRealPath. When called on a path to a normal file, with no 
symlinks in it, it will resolve the real path with pure java string 
manipulation. When called on "link" above, the java loop detects that 
there is a symlink and defers to a native Windows API to resolve the 
symlink. This is done by getting a handle to the link, then resolving by 
handle. The file path returned from that call has the subst resolved.

I don't know of another way to explicitly resolve subst drives back to 
their original directory from Java, so the workaround I put in place 
here simply does the same thing as the actual test. I create a link to 
"dir" and call toRealPath on it. If dir was located on a subst drive, 
then the return value from that call is guaranteed to have resolved that 
subst back to the original location.

I've tried to make this clearer in the comment.

http://cr.openjdk.java.net/~erikj/8213214/webrev.02/

/Erik





More information about the build-dev mailing list