RFR: 8274883: (se) Selector.open throws IAE when the default file system provider is changed to a custom provider [v2]
Alan Bateman
alanb at openjdk.java.net
Tue Dec 7 06:42:11 UTC 2021
On Mon, 6 Dec 2021 15:09:52 GMT, Maxim Kartashev <duke at openjdk.java.net> wrote:
>> The gist of the problem: when a file system is specified via `-Djava.nio.file.spi.DefaultFileSystemProvider`, a call to `SelectorProvider.provider().openSelector()` ends with a throw on Windows.
>>
>> There are two distinct components to the problem:
>>
>> 1. `ExceptionInInitializerError` is thrown during the static initialization of the `UnixDomainSockets.UNNAMED` field even though it isn't used on this code path (see `UnixDomainSocketAddress.of()` that throws `IllegalArgumentException` if invoked on a path from a non-default file system).
>> This is fixed by lazy-initializing the static member `UNNAMED` of `UnixDomainSockets` so that this initialization doesn't throw unless actually used.
>>
>> 2. `IllegalArgumentException` is thrown by `UnixDomainSocketAddress.of()` later on when `ServerSocketChannel` tries to use Windows version of `PipeImpl` and its method `createListener()` specifically. That `PipeImpl` probes for the availability of Unix Domain Sockets by trying to bind to a unique temporary name. That call throws `IAE` when a non-default Java file system is installed while the probing code (`PipeImpl.createListener()`) only expects `UnsupportedOperationException` or `IOException`.
>> The fix is to re-throw `UOE` instead of `IAE` in `UnixDomainSockets.genrateTempName()`. This is more consistent with the definition of the exception purpose ("requested operation is not supported"). So with this change, a loopback network socket will be used to implement a pipe on a non-default Java file system. Also, pipes do not rely on the default Java file system on other platforms (Linux, MacOS) as well.
>>
>> Tested by running `jtreg:test/jdk/java/nio` on Window, MacOS, and Linux.
>
> Maxim Kartashev has updated the pull request incrementally with one additional commit since the last revision:
>
> Addressed PR comments:
>
> - renamed UNNAMEDHolder to UnnamedHolder,
> - renamed getUNNAMED() to unnamed(),
> - replaced catch IllegalArgumentException with a check for the provider.
@Michael-Mc-Mahon The issue is assigned to you? Are you okay if @mkartashev takes it?
The updated src changes looks okay.
test/jdk/java/nio/channels/Selector is probably the right location for the test as this issue is about the wakeup mechanism. I'd prefer to use a test name that is a bit more consistent with the naming in the area. Something like CustomFileSystem.java might be okay. We can also change the test to use Selector.open() as that is the user-facing API. I assume @library /test/lib can be dropped from the test description as the test doesn't use common test infrastructure.
-------------
PR: https://git.openjdk.java.net/jdk/pull/6722
More information about the nio-dev
mailing list