Waterfall/BungeeCord-Patches/0064-Replace-reflection-inside-netty-with-ChannelFactory.patch
Shane Freeder be3a798a36
Updated Upstream (BungeeCord)
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

BungeeCord Changes:
f5157f12 #3438: Fix possible race condition in duplicate player check
df20effa #3557: Replace Guava Charsets with Java StandardCharsets
2023-11-04 01:12:26 +00:00

147 lines
7.8 KiB
Diff

From caf1fb139eb3ba9276f69084da78e2e79758e6e5 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 7cd0017d..01c8a172 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 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 553680ee..2f996a69 100644
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
@@ -411,7 +411,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 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<? 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
{
@@ -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<? 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 epoll ? EpollDatagramChannel.class : NioDatagramChannel.class;
--
2.42.1