From 46e4d36543438b1b13784971146e81394c8c9b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Dziedziul?= Date: Thu, 7 Sep 2023 10:01:48 +0200 Subject: [PATCH] Don't set SO_REUSEPORT on Windows (#23947) [5.3.z] --- .../nio/NioAsyncServerSocketOptions.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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 df82340d5ba2..2b1aa6173a6a 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 @@ -16,14 +16,17 @@ package com.hazelcast.internal.tpcengine.nio; -import com.hazelcast.internal.tpcengine.net.AsyncSocketOptions; 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.HashSet; +import java.util.Set; import static com.hazelcast.internal.tpcengine.util.Preconditions.checkNotNull; import static com.hazelcast.internal.tpcengine.util.ReflectionUtil.findStaticFieldValue; @@ -36,6 +39,12 @@ public class NioAsyncServerSocketOptions implements AsyncSocketOptions { // This option is available since Java 9, so we need to use reflection. private static final SocketOption STD_SOCK_OPT_SO_REUSEPORT = findStaticFieldValue(StandardSocketOptions.class, "SO_REUSEPORT"); + private static final Set> WINDOWS_UNSUPPORTED_OPTIONS; + + static { + WINDOWS_UNSUPPORTED_OPTIONS = new HashSet<>(); + WINDOWS_UNSUPPORTED_OPTIONS.add(STD_SOCK_OPT_SO_REUSEPORT); + } private final ServerSocketChannel serverSocketChannel; @@ -64,7 +73,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