On Thu, 21 Nov 2024 08:32:55 GMT, Volkan Yazıcı <d...@openjdk.org> wrote:

>> This PR, addressing 8343791, enhances `Socket#connect()` and effectively 
>> makes it close the `Socket` if `SocketImpl#connect()` fails with a
>> 
>> 1. `SocketTimeoutException`
>> 2. `InterruptedIOException` in an interrupted vthread
>> 3. `IOException` that is *not* an `UnknownHostException`
>> 
>> On the other hand, socket will *not* be closed if `SocketImpl#connect()` 
>> fails with a
>> 
>> * `InterruptedIOException` that is neither a `SocketTimeoutException`, nor 
>> from an interrupted vthread
>> * `UnknownHostException`
>> 
>> Note that in case of an `UHE`, `Socket` and `SocketImpl` states will match, 
>> i.e., `SOCKET_CREATED`.
>> 
>> One peculiar detail retained from the old code is that 
>> `InterruptedIOException` is causing a socket close *iff* we are in an 
>> interrupted vhtread. (Guess: To ensure resources within a vthread task scope 
>> is released in tandem with the completion of the scope?) I don't know why 
>> other `InterruptedIOException` cases are left out.
>> 
>> Before "8284161: Implementation of Virtual Threads (Preview)" (9583e365), 
>> `connect()` failures were getting propagated untouched. 8284161 added the 
>> logic to throw `SocketException("Closed by interrupt")` *and* close the 
>> socket if `InterruptedIOException` is caught in an interrupted vthread.
>> 
>> Judging from the last state of the `Socket#connect()` javadoc, I find it 
>> very difficult to wrap ones mind around in which cases the socket will be 
>> closed. As a user, I'd be in favor of a simpler approach – e.g., `try { 
>> socketImpl.connect(); } catch (Exception e) { closeQuietly(e); throw e }` – 
>> at the cost of incorporating a backward incompatible behavioral change. I 
>> would appreciate your advice on how shall we proceed further.
>
> Volkan Yazıcı has updated the pull request incrementally with four additional 
> commits since the last revision:
> 
>  - Revert `UHE` message change in `NioSocketImpl`
>  - Remove self-reference guard in `closeSuppressingExceptions()`
>  - Add back incorrectly removed `SocketTimeoutException` Javadoc
>  - Remove unused `port` variable

src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java line 612:

> 610:             close();
> 611:             if (ioe instanceof InterruptedIOException) {
> 612:                 throw new SocketException("Closed by interrupt");

SocketTimeoutException is InterruptedIOException so need to distinguish this 
from the case where a virtual thread is interrupt during connect. The change 
for NioSocketImpl needs to be like this (once exception handle in switch comes 
then we can improve this).


             }
         } catch (IOException ioe) {
             close();
-            if (ioe instanceof InterruptedIOException) {
+            if (ioe instanceof SocketTimeoutException) {
                 throw ioe;
+            } else if (ioe instanceof InterruptedIOException) {
+                assert Thread.currentThread().isVirtual();
+                throw new SocketException("Closed by interrupt");
             } else {
                 throw SocketExceptions.of(ioe, isa);
             }

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22160#discussion_r1851727018

Reply via email to