From bae0045a3b7394ba2071ab4e5ac2d7fe8fa5a157 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 af65e192..6a045d16 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; @@ -119,6 +120,12 @@ public class PipelineUtils public static final String LEGACY_KICKER = "legacy-kick"; private static boolean epoll; + // 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 { @@ -134,6 +141,12 @@ public class PipelineUtils ProxyServer.getInstance().getLogger().log( Level.WARNING, "Epoll is not working, falling back to NIO: {0}", Util.exception( Epoll.unavailabilityCause() ) ); } } + // Waterfall start: netty reflection -> factory + serverChannelFactory = epoll ? EpollServerSocketChannel::new : NioServerSocketChannel::new; + serverChannelDomainFactory = epoll ? EpollServerDomainSocketChannel::new : null; + channelFactory = epoll ? EpollSocketChannel::new : NioSocketChannel::new; + channelDomainFactory = epoll ? EpollDomainSocketChannel::new : null; + // Waterfall end } public static EventLoopGroup newEventLoopGroup(int threads, ThreadFactory factory) @@ -165,6 +178,34 @@ public class PipelineUtils return 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 epoll ? EpollDatagramChannel.class : NioDatagramChannel.class; -- 2.43.0.windows.1