Waterfall/BungeeCord-Patches/0063-Replace-reflection-ins...

147 lines
7.9 KiB
Diff

From 429d77cd283c12f043fb0da276a0a3856aa31ab2 Mon Sep 17 00:00:00 2001
From: Janmm14 <gitconfig1@janmm14.de>
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<String> 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<? extends ServerChannel> serverChannelFactory;
+ private static final ChannelFactory<? extends ServerChannel> serverChannelDomainFactory;
+ private static final ChannelFactory<? extends Channel> channelFactory;
+ private static final ChannelFactory<? extends Channel> 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<? extends ServerChannel> getServerChannelFactory(SocketAddress address)
+ {
+ if ( address instanceof DomainSocketAddress )
+ {
+ ChannelFactory<? extends ServerChannel> factory = PipelineUtils.serverChannelDomainFactory;
+ Preconditions.checkState( factory != null, "Epoll required to have UNIX sockets" );
+
+ return factory;
+ }
+
+ return serverChannelFactory;
+ }
+
+ public static ChannelFactory<? extends Channel> getChannelFactory(SocketAddress address)
+ {
+ if ( address instanceof DomainSocketAddress )
+ {
+ ChannelFactory<? extends Channel> factory = PipelineUtils.channelDomainFactory;
+ Preconditions.checkState( factory != null, "Epoll required to have UNIX sockets" );
+
+ return factory;
+ }
+
+ return channelFactory;
+ }
+ // Waterfall end
+
public static Class<? extends DatagramChannel> getDatagramChannel()
{
return io_uring ? IOUringDatagramChannel.class : epoll ? EpollDatagramChannel.class : NioDatagramChannel.class;
--
2.44.0