From c607ded6d7a9b147a4f3bcfd602316adb7683b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Dziedziul?= Date: Wed, 6 Sep 2023 09:52:20 +0200 Subject: [PATCH] Don't set SO_REUSEPORT on Windows (#23947) [HZ-2213] SO_REUSEADDR flag works as expected on POSIX platforms, but will cause indeterminate behaviors on Windows sockets. See: - https://github.com/eclipse/jetty.project/issues/6661#issuecomment-1281521862 - learn.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse#using-so_reuseaddr --- .../tpcengine/nio/NioAsyncServerSocketOptions.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/hazelcast-tpc-engine/src/main/java/com/hazelcast/internal/tpcengine/nio/NioAsyncServerSocketOptions.java b/hazelcast-tpc-engine/src/main/java/com/hazelcast/internal/tpcengine/nio/NioAsyncServerSocketOptions.java index e8c8d4a7fd48..7c605068d612 100644 --- a/hazelcast-tpc-engine/src/main/java/com/hazelcast/internal/tpcengine/nio/NioAsyncServerSocketOptions.java +++ b/hazelcast-tpc-engine/src/main/java/com/hazelcast/internal/tpcengine/nio/NioAsyncServerSocketOptions.java @@ -18,12 +18,14 @@ import com.hazelcast.internal.tpcengine.Option; import com.hazelcast.internal.tpcengine.net.AsyncSocketOptions; +import com.hazelcast.internal.tpcengine.util.OS; import java.io.IOException; import java.io.UncheckedIOException; import java.net.SocketOption; import java.net.StandardSocketOptions; import java.nio.channels.ServerSocketChannel; +import java.util.Set; import static com.hazelcast.internal.tpcengine.util.Preconditions.checkNotNull; @@ -32,6 +34,7 @@ */ public class NioAsyncServerSocketOptions implements AsyncSocketOptions { + private static final Set> WINDOWS_UNSUPPORTED_OPTIONS = Set.of(StandardSocketOptions.SO_REUSEPORT); private final ServerSocketChannel serverSocketChannel; NioAsyncServerSocketOptions(ServerSocketChannel serverSocketChannel) { @@ -59,7 +62,13 @@ public boolean isSupported(Option option) { } private boolean isSupported(SocketOption socketOption) { - return socketOption != null && serverSocketChannel.supportedOptions().contains(socketOption); + if (socketOption == null) { + return false; + } + if (OS.isWindows() && WINDOWS_UNSUPPORTED_OPTIONS.contains(socketOption)) { + return false; + } + return serverSocketChannel.supportedOptions().contains(socketOption); } @Override