From 2faf975aab41bc88352e2c6a1affc6a9b2f3c6cc Mon Sep 17 00:00:00 2001 From: Janmm14 Date: Fri, 31 Mar 2023 07:22:00 +0200 Subject: [PATCH] Replace reflection inside netty with ChannelFactory (#797) --- ...ion-inside-netty-with-ChannelFactory.patch | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 BungeeCord-Patches/0066-Replace-reflection-inside-netty-with-ChannelFactory.patch diff --git a/BungeeCord-Patches/0066-Replace-reflection-inside-netty-with-ChannelFactory.patch b/BungeeCord-Patches/0066-Replace-reflection-inside-netty-with-ChannelFactory.patch new file mode 100644 index 0000000..c6cee4a --- /dev/null +++ b/BungeeCord-Patches/0066-Replace-reflection-inside-netty-with-ChannelFactory.patch @@ -0,0 +1,146 @@ +From cb6c54205c75372d06592002a39699cbff7064fb 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 e0fcd8fb..4207fc48 100644 +--- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java ++++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +@@ -358,7 +358,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 1ea654f1..c2663b66 100644 +--- a/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java ++++ b/proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java +@@ -183,7 +183,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 ) + .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 b44d13e5..955a7b3f 100644 +--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java ++++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java +@@ -384,7 +384,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 2a21243b..1cd64a12 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; +@@ -114,6 +115,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 + { +@@ -129,6 +136,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) +@@ -160,6 +173,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.40.0.windows.1 +