Re: RFR: 8343791: Socket.connect API should document whether the socket will be closed when hostname resolution fails or another error occurs [v2]

2024-11-16 Thread Alan Bateman
On Fri, 15 Nov 2024 19:14:00 GMT, Volkan Yazıcı  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 refreshed the contents of this pull request, and previous 
> commits have been removed. The incremental views will show differences 
> compared to the previous content of the PR. The pull request contains one new 
> commit since the last revision:
> 
>   8343791: Close `Socket` on `connect()` failures

I've added a lengthy comment to the JBS issue as there some decisions to make 
on this issue.

-

PR Comment: https://git.openjdk.org/jdk/pull/22160#issuecomment-2480522300


Re: RFR: 8343791: Socket.connect API should document whether the socket will be closed when hostname resolution fails or another error occurs [v2]

2024-11-15 Thread Volkan Yazıcı
> 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 refreshed the contents of this pull request, and previous 
commits have been removed. The incremental views will show differences compared 
to the previous content of the PR. The pull request contains one new commit 
since the last revision:

  8343791: Close `Socket` on `connect()` failures

-

Changes:
  - all: https://git.openjdk.org/jdk/pull/22160/files
  - new: https://git.openjdk.org/jdk/pull/22160/files/512e1fed..8a36a881

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=22160&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=22160&range=00-01

  Stats: 0 lines in 0 files changed: 0 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/22160.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/22160/head:pull/22160

PR: https://git.openjdk.org/jdk/pull/22160