RFR: 8252883: AccessDeniedException caused by delayed file deletion on Windows [v2]

Evan Whelan ewhelan at openjdk.java.net
Tue Feb 16 11:37:10 UTC 2021


On Mon, 15 Feb 2021 12:55:46 GMT, Daniel Fuchs <dfuchs at openjdk.org> wrote:

>> Evan Whelan has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   8252883: Doc cleanup, code formatting and throwing exceptions instead of catching
>
> src/java.logging/share/classes/java/util/logging/FileHandler.java line 39:
> 
>> 37: import java.nio.channels.FileChannel;
>> 38: import java.nio.channels.OverlappingFileLockException;
>> 39: import java.nio.file.*;
> 
> We avoid using the wildcard with imports in the JDK sources. Could you revert that change?

Yes, reverted thanks

> src/java.logging/share/classes/java/util/logging/FileHandler.java line 512:
> 
>> 510:                         // Try again. If it doesn't work, then this will
>> 511:                         // eventually ensure that we increment "unique" and
>> 512:                         // use another file name.
> 
> I believe this would be more clear if the comment was put inside the if statement, just before continue.
> It might be good to add some words about what might be causing the AccessDeniedException as well... 
> Maybe something like:
> 
>                     } catch (AccessDeniedException ade) {
>                         // This can be either a temporary, or a more permanent issue.
>                         // The lock file might be still pending deletion from a previous run
>                         // (temporary), or the parent directory might not be accessible, etc...
>                         // If we can write to the current directory, and this is a regular file, 
>                         // let's try again.
>                         if (Files.isRegularFile(lockFilePath, LinkOption.NOFOLLOW_LINKS)
>                             && isParentWritable(lockFilePath)) {
>                             // Try again. If it doesn't work, then this will
>                             // eventually ensure that we increment "unique" and
>                             // use another file name.
>                             continue;
>                         } else {
>                             throw ade; // no need to retry
>                         } ...

I agree. I've updated the comments

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 47:
> 
>> 45:         if (!(args.length == 2 || args.length == 1)) {
>> 46:             System.out.println("Usage error: expects java FileHandlerAccessTest [process/thread] <count>");
>> 47:             System.exit(1);
> 
> We usually avoid `System.exit()` in tests. `return` should be enough.

Changed to `return`

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 75:
> 
>> 73:         }
>> 74:         catch(Exception e) {
>> 75:             e.printStackTrace();
> 
> If you only print exceptions, when does the test fail?

Thanks for catching this. 

I've updated the test to throw the exceptions rather than printing stack trace. This was a modified version of the test for debugging purposes.

It's worth noting that it's not possible to write a test which can deterministically prove/ verify the behaviour (and related fix) of the parent bug as this involves the situation where multiple threads conflict on a Windows machine.

The test attached is a best-effort and was tried around 40 times.

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 98:
> 
>> 96:             childProcess.waitFor();
>> 97:         }
>> 98:         catch(Exception e) {
> 
> space missing after `catch`

Fixed

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 99:
> 
>> 97:         }
>> 98:         catch(Exception e) {
>> 99:             e.printStackTrace();
> 
> Same remark here: should this make the test fail?

Thanks Daniel, please see my above reply

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 101:
> 
>> 99:             e.printStackTrace();
>> 100:         }
>> 101:         finally {
> 
> I would prefer if `catch` and `finally` where on the same line than the preceding closing brace:
> 
>     try {
>         ...
>     } catch (...) {
>         ...
>     } finally {
>         ...
>     }

Fixed

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 106:
> 
>> 104:             }
>> 105:             if (bufferedReader != null){
>> 106:                 try{
> 
> space missing after `try`

Fixed

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 109:
> 
>> 107:                     bufferedReader.close();
>> 108:                 }
>> 109:                 catch(Exception ignored){}
> 
> space missing after `catch`

Fixed

> test/jdk/java/util/logging/FileHandlerAccessTest.java line 113:
> 
>> 111:         }
>> 112:     }
>> 113: }
> 
> Please add a newline at the end of the file.

Done

-------------

PR: https://git.openjdk.java.net/jdk/pull/2572


More information about the core-libs-dev mailing list