From 429d77cd283c12f043fb0da276a0a3856aa31ab2 Mon Sep 17 00:00:00 2001 From: Janmm14 Date: Mon, 21 Jun 2021 23:43:39 +0200 Subject: [PATCH] Replace reflection inside netty with ChannelFactory. Thanks for pointing it out @MrIvanPlays diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index b4e101ac..9b93d2c3 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -361,7 +361,7 @@ public class BungeeCord extends ProxyServer } }; new ServerBootstrap() - .channel( PipelineUtils.getServerChannel( info.getSocketAddress() ) ) + .channelFactory( PipelineUtils.getServerChannelFactory( info.getSocketAddress() ) ) // Waterfall - netty reflection -> factory .option( ChannelOption.SO_REUSEADDR, true ) // TODO: Move this elsewhere! .childAttr( PipelineUtils.LISTENER, info ) .childHandler( PipelineUtils.SERVER_CHILD ) diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java index 377df7ec..8f531f85 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java @@ -184,7 +184,7 @@ public class BungeeServerInfo implements ServerInfo } }; new Bootstrap() - .channel( PipelineUtils.getChannel( socketAddress ) ) + .channelFactory( PipelineUtils.getChannelFactory( socketAddress ) ) // Waterfall - netty reflection -> factory .group( BungeeCord.getInstance().workerEventLoopGroup ) .handler( PipelineUtils.BASE_SERVERSIDE ) .option( ChannelOption.CONNECT_TIMEOUT_MILLIS, BungeeCord.getInstance().getConfig().getRemotePingTimeout() ) diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java index f29a6f62..1d009633 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -414,7 +414,7 @@ public final class UserConnection implements ProxiedPlayer } }; Bootstrap b = new Bootstrap() - .channel( PipelineUtils.getChannel( target.getAddress() ) ) + .channelFactory( PipelineUtils.getChannelFactory( target.getAddress() ) ) // Waterfall - netty reflection -> factory .group( ch.getHandle().eventLoop() ) .handler( initializer ) .option( ChannelOption.CONNECT_TIMEOUT_MILLIS, request.getConnectTimeout() ) diff --git a/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java b/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java index 37337429..c3683c30 100644 --- a/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java +++ b/proxy/src/main/java/net/md_5/bungee/http/HttpClient.java @@ -111,7 +111,8 @@ public class HttpClient private static void getWithNettyResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future, Callback callback, boolean ssl) { java.net.InetSocketAddress address = java.net.InetSocketAddress.createUnresolved(uri.getHost(), port); - new Bootstrap().channel( PipelineUtils.getChannel( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ). + // Waterfall - netty reflection -> factory + new Bootstrap().channelFactory( PipelineUtils.getChannelFactory( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ). option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).resolver(dnsResolverGroup).remoteAddress( address ).connect().addListener( future ); } @@ -130,7 +131,8 @@ public class HttpClient } addressCache.put( uri.getHost(), inetHost ); } - new Bootstrap().channel( PipelineUtils.getChannel( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ). + // Waterfall - netty reflection -> factory + new Bootstrap().channelFactory( PipelineUtils.getChannelFactory( null ) ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ). option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).remoteAddress( inetHost, port ).connect().addListener( future ); } // Waterfall End diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java index 3b157d79..52c308f7 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java @@ -5,6 +5,7 @@ import io.github.waterfallmc.waterfall.event.ConnectionInitEvent; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelException; +import io.netty.channel.ChannelFactory; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; @@ -125,6 +126,12 @@ public class PipelineUtils private static boolean epoll; private static boolean io_uring; + // Waterfall start: netty reflection -> factory + private static final ChannelFactory serverChannelFactory; + private static final ChannelFactory serverChannelDomainFactory; + private static final ChannelFactory channelFactory; + private static final ChannelFactory channelDomainFactory; + // Waterfall end static { @@ -155,6 +162,12 @@ public class PipelineUtils } } } + // Waterfall start: netty reflection -> factory + serverChannelFactory = io_uring ? IOUringServerSocketChannel::new : epoll ? EpollServerSocketChannel::new : NioServerSocketChannel::new; + serverChannelDomainFactory = io_uring ? IOUringServerSocketChannel::new : epoll ? EpollServerDomainSocketChannel::new : null; + channelFactory = io_uring ? IOUringSocketChannel::new : epoll ? EpollSocketChannel::new : NioSocketChannel::new; + channelDomainFactory = io_uring ? IOUringSocketChannel::new : epoll ? EpollDomainSocketChannel::new : null; + // Waterfall end } public static EventLoopGroup newEventLoopGroup(int threads, ThreadFactory factory) @@ -186,6 +199,34 @@ public class PipelineUtils return io_uring ? IOUringSocketChannel.class : epoll ? EpollSocketChannel.class : NioSocketChannel.class; } + // Waterfall start: netty reflection -> factory + public static ChannelFactory getServerChannelFactory(SocketAddress address) + { + if ( address instanceof DomainSocketAddress ) + { + ChannelFactory factory = PipelineUtils.serverChannelDomainFactory; + Preconditions.checkState( factory != null, "Epoll required to have UNIX sockets" ); + + return factory; + } + + return serverChannelFactory; + } + + public static ChannelFactory getChannelFactory(SocketAddress address) + { + if ( address instanceof DomainSocketAddress ) + { + ChannelFactory factory = PipelineUtils.channelDomainFactory; + Preconditions.checkState( factory != null, "Epoll required to have UNIX sockets" ); + + return factory; + } + + return channelFactory; + } + // Waterfall end + public static Class getDatagramChannel() { return io_uring ? IOUringDatagramChannel.class : epoll ? EpollDatagramChannel.class : NioDatagramChannel.class; -- 2.44.0