From 2eb1e234f10f8228685e9a6350b6d1bfdb89965b Mon Sep 17 00:00:00 2001 From: AlexProgrammerDE <40795980+AlexProgrammerDE@users.noreply.github.com> Date: Mon, 19 Feb 2024 20:17:32 +0100 Subject: [PATCH] Properly detect tcp fast open support --- .../soulfire/server/SoulFireServer.java | 4 +- .../server/plugins/ChatMessageLogger.java | 7 +- .../server/protocol/netty/SFNettyHelper.java | 74 ++++++++++--------- .../protocol/netty/ViaClientSession.java | 7 +- .../soulfire/server/util/ExpiringSet.java | 1 - 5 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/main/java/net/pistonmaster/soulfire/server/SoulFireServer.java b/src/main/java/net/pistonmaster/soulfire/server/SoulFireServer.java index 29d0a8132..f2b835192 100644 --- a/src/main/java/net/pistonmaster/soulfire/server/SoulFireServer.java +++ b/src/main/java/net/pistonmaster/soulfire/server/SoulFireServer.java @@ -101,9 +101,7 @@ public class SoulFireServer { .mapper(TranslatableComponent.class, TranslationMapper.INSTANCE) .build(); public static final PlainTextComponentSerializer PLAIN_MESSAGE_SERIALIZER = - PlainTextComponentSerializer.builder() - .flattener(FLATTENER) - .build(); + PlainTextComponentSerializer.builder().flattener(FLATTENER).build(); private final Injector injector = new InjectorBuilder().addDefaultHandlers("net.pistonmaster.soulfire").create(); diff --git a/src/main/java/net/pistonmaster/soulfire/server/plugins/ChatMessageLogger.java b/src/main/java/net/pistonmaster/soulfire/server/plugins/ChatMessageLogger.java index d6e799b92..348c440fd 100644 --- a/src/main/java/net/pistonmaster/soulfire/server/plugins/ChatMessageLogger.java +++ b/src/main/java/net/pistonmaster/soulfire/server/plugins/ChatMessageLogger.java @@ -56,9 +56,10 @@ public static void onMessage(ChatMessageReceiveEvent event) { return; } - var sender = Optional.ofNullable(event.sender()) - .map(ChatMessageReceiveEvent.ChatMessageSender::senderName) - .orElse("Server"); + var sender = + Optional.ofNullable(event.sender()) + .map(ChatMessageReceiveEvent.ChatMessageSender::senderName) + .orElse("Server"); var message = Component.text("<" + sender + "> ").append(event.message()); var ansiMessage = ANSI_MESSAGE_SERIALIZER.serialize(message); diff --git a/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/SFNettyHelper.java b/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/SFNettyHelper.java index 2898706a4..590c3d01f 100644 --- a/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/SFNettyHelper.java +++ b/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/SFNettyHelper.java @@ -21,9 +21,11 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; +import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollDatagramChannel; import io.netty.channel.epoll.EpollEventLoopGroup; import io.netty.channel.epoll.EpollSocketChannel; +import io.netty.channel.kqueue.KQueue; import io.netty.channel.kqueue.KQueueDatagramChannel; import io.netty.channel.kqueue.KQueueEventLoopGroup; import io.netty.channel.kqueue.KQueueSocketChannel; @@ -39,49 +41,43 @@ import io.netty.incubator.channel.uring.IOUringEventLoopGroup; import io.netty.incubator.channel.uring.IOUringSocketChannel; import java.util.concurrent.ThreadFactory; +import java.util.function.BiFunction; import net.pistonmaster.soulfire.proxy.SWProxy; public class SFNettyHelper { - public static final boolean SUPPORTS_TPC_FAST_OPEN_CONNECT = - IOUring.isTcpFastOpenClientSideAvailable(); - public static final Class CHANNEL_CLASS; - public static final Class DATAGRAM_CHANNEL_CLASS; - - static { - var transportMethod = TransportHelper.determineTransportMethod(); - switch (transportMethod) { - case IO_URING -> { - CHANNEL_CLASS = IOUringSocketChannel.class; - DATAGRAM_CHANNEL_CLASS = IOUringDatagramChannel.class; - } - case EPOLL -> { - CHANNEL_CLASS = EpollSocketChannel.class; - DATAGRAM_CHANNEL_CLASS = EpollDatagramChannel.class; - } - case KQUEUE -> { - CHANNEL_CLASS = KQueueSocketChannel.class; - DATAGRAM_CHANNEL_CLASS = KQueueDatagramChannel.class; - } - case NIO -> { - CHANNEL_CLASS = NioSocketChannel.class; - DATAGRAM_CHANNEL_CLASS = NioDatagramChannel.class; - } - default -> throw new IllegalStateException("Unexpected value: " + transportMethod); - } - } + public static final TransportMethod TRANSPORT_METHOD = + switch (TransportHelper.determineTransportMethod()) { + case IO_URING -> + new TransportMethod( + IOUring.isTcpFastOpenClientSideAvailable(), + IOUringSocketChannel.class, + IOUringDatagramChannel.class, + IOUringEventLoopGroup::new); + case EPOLL -> + new TransportMethod( + Epoll.isTcpFastOpenClientSideAvailable(), + EpollSocketChannel.class, + EpollDatagramChannel.class, + EpollEventLoopGroup::new); + case KQUEUE -> + new TransportMethod( + KQueue.isTcpFastOpenClientSideAvailable(), + KQueueSocketChannel.class, + KQueueDatagramChannel.class, + KQueueEventLoopGroup::new); + case NIO -> + new TransportMethod( + false, NioSocketChannel.class, NioDatagramChannel.class, NioEventLoopGroup::new); + }; private SFNettyHelper() {} public static EventLoopGroup createEventLoopGroup(int threads, String name) { - ThreadFactory threadFactory = - r -> Thread.ofPlatform().name(name).daemon().priority(Thread.MAX_PRIORITY).unstarted(r); - EventLoopGroup group = - switch (TransportHelper.determineTransportMethod()) { - case IO_URING -> new IOUringEventLoopGroup(threads, threadFactory); - case EPOLL -> new EpollEventLoopGroup(threads, threadFactory); - case KQUEUE -> new KQueueEventLoopGroup(threads, threadFactory); - case NIO -> new NioEventLoopGroup(threads, threadFactory); - }; + var group = + TRANSPORT_METHOD.eventLoopFactory.apply( + threads, + r -> + Thread.ofPlatform().name(name).daemon().priority(Thread.MAX_PRIORITY).unstarted(r)); Runtime.getRuntime().addShutdownHook(new Thread(group::shutdownGracefully)); @@ -106,4 +102,10 @@ public static void addProxy(ChannelPipeline pipeline, SWProxy proxy) { default -> throw new UnsupportedOperationException("Unsupported proxy type: " + proxy.type()); } } + + public record TransportMethod( + boolean tcpFastOpenClientSideAvailable, + Class channelClass, + Class datagramChannelClass, + BiFunction eventLoopFactory) {} } diff --git a/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/ViaClientSession.java b/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/ViaClientSession.java index dcba7e1f1..7627fb9f0 100644 --- a/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/ViaClientSession.java +++ b/src/main/java/net/pistonmaster/soulfire/server/protocol/netty/ViaClientSession.java @@ -123,9 +123,10 @@ public void connect(boolean wait) { throw new IllegalStateException("Proxy must support UDP! (Only SOCKS5 is supported)"); } - bootstrap.channelFactory(RakChannelFactory.client(SFNettyHelper.DATAGRAM_CHANNEL_CLASS)); + bootstrap.channelFactory( + RakChannelFactory.client(SFNettyHelper.TRANSPORT_METHOD.datagramChannelClass())); } else { - bootstrap.channel(SFNettyHelper.CHANNEL_CLASS); + bootstrap.channel(SFNettyHelper.TRANSPORT_METHOD.channelClass()); } bootstrap @@ -143,7 +144,7 @@ public void connect(boolean wait) { } else { bootstrap.option(ChannelOption.TCP_NODELAY, true).option(ChannelOption.SO_KEEPALIVE, true); - if (SFNettyHelper.SUPPORTS_TPC_FAST_OPEN_CONNECT) { + if (SFNettyHelper.TRANSPORT_METHOD.tcpFastOpenClientSideAvailable()) { bootstrap.option(ChannelOption.TCP_FASTOPEN_CONNECT, true); } } diff --git a/src/main/java/net/pistonmaster/soulfire/server/util/ExpiringSet.java b/src/main/java/net/pistonmaster/soulfire/server/util/ExpiringSet.java index 3951aabc6..84ee57acc 100644 --- a/src/main/java/net/pistonmaster/soulfire/server/util/ExpiringSet.java +++ b/src/main/java/net/pistonmaster/soulfire/server/util/ExpiringSet.java @@ -17,7 +17,6 @@ */ package net.pistonmaster.soulfire.server.util; - import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import java.util.concurrent.TimeUnit;