Skip to content

Conversation

@GoeLin
Copy link
Member

@GoeLin GoeLin commented Oct 21, 2025

I backport this for parity with 17.0.18-oracle.

Needed resolve and adaptions:

Net.java: resolved static initializer.
SocketChannelImpl.java: In implCloseBlockingMode(), the code guarded by the new condition is not in 17. Omitted.
Net.c: Copyright.

The test exercises platform and virtual threads.
I simplified this to what is supported in 17.
See extra commit.


Progress

  • Change must be properly reviewed (1 review required, with at least 1 Reviewer)
  • Change must not contain extraneous whitespace
  • Commit message must refer to an issue
  • JDK-8358764 needs maintainer approval

Issue

  • JDK-8358764: (sc) SocketChannel.close when thread blocked in read causes connection to be reset (win) (Bug - P3)

Reviewers

Reviewing

Using git

Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk17u-dev.git pull/4076/head:pull/4076
$ git checkout pull/4076

Update a local copy of the PR:
$ git checkout pull/4076
$ git pull https://git.openjdk.org/jdk17u-dev.git pull/4076/head

Using Skara CLI tools

Checkout this PR locally:
$ git pr checkout 4076

View PR using the GUI difftool:
$ git pr show -t 4076

Using diff file

Download this PR as a diff file:
https://git.openjdk.org/jdk17u-dev/pull/4076.diff

Using Webrev

Link to Webrev Comment

@GoeLin GoeLin changed the title Goetz backport 8358764 backport 83f9c250221f707be484e0163fe9040f99474412 Oct 21, 2025
@bridgekeeper
Copy link

bridgekeeper bot commented Oct 21, 2025

👋 Welcome back goetz! A progress list of the required criteria for merging this PR into master will be added to the body of your pull request. There are additional pull request commands available for use with this pull request.

@openjdk
Copy link

openjdk bot commented Oct 21, 2025

❗ This change is not yet ready to be integrated.
See the Progress checklist in the description for automated requirements.

@openjdk openjdk bot changed the title backport 83f9c250221f707be484e0163fe9040f99474412 8358764: (sc) SocketChannel.close when thread blocked in read causes connection to be reset (win) Oct 21, 2025
@openjdk
Copy link

openjdk bot commented Oct 21, 2025

This backport pull request has now been updated with issue from the original commit.

@openjdk openjdk bot added backport Port of a pull request already in a different code base rfr Pull request is ready for review labels Oct 21, 2025
@mlbridge
Copy link

mlbridge bot commented Oct 21, 2025

Webrevs

@TheRealMDoerr
Copy link
Contributor

It is true that the affected part of implCloseBlockingMode() has been introduced with Loom, but it looks relevant without Loom, too. Note that implCloseNonBlockingMode() handles StandardSocketOptions.SO_LINGER, too.

Without this change, your PR basically only adds a test because shouldShutdownWriteBeforeClose() is unused.

diff --git a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
index a771d998b24..09c9ed4df99 100644
--- a/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
+++ b/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java
@@ -1019,7 +1019,19 @@ class SocketChannelImpl
     private void implCloseBlockingMode() throws IOException {
         synchronized (stateLock) {
             assert state < ST_CLOSING;
+            boolean connected = (state == ST_CONNECTED);
             state = ST_CLOSING;
+
+            if (connected && Net.shouldShutdownWriteBeforeClose()) {
+                // shutdown output when linger interval not set to 0
+                try {
+                    var SO_LINGER = StandardSocketOptions.SO_LINGER;
+                    if ((int) Net.getSocketOption(fd, SO_LINGER) != 0) {
+                        Net.shutdown(fd, Net.SHUT_WR);
+                    }
+                } catch (IOException ignore) { }
+            }
+
             if (!tryClose()) {
                 long reader = readerThread;
                 long writer = writerThread;

Copy link
Contributor

@TheRealMDoerr TheRealMDoerr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! This backport LGTM, now. It would be great if someone from the core-libs team could confirm that the SO_LINGER code is adequate for 17u.

@openjdk
Copy link

openjdk bot commented Oct 27, 2025

⚠️ @GoeLin This change is now ready for you to apply for maintainer approval. This can be done directly in each associated issue or by using the /approval command.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport Port of a pull request already in a different code base rfr Pull request is ready for review

Development

Successfully merging this pull request may close these issues.

2 participants