mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-07-09 04:44:47 +02:00
3a793b886c
Upstream has released updates that appears 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: d8c222ae Update date d20e622b Apply checkstyle to javadoc 6c8a0cce Remove m2e settings, causes useless warnings 2f547f73 Fix some javadoc warnings 5f29e939 #2720: Send different log message for pings (vs login) 46521568 #2740: Fix BaseComponent#equals() stack overflow d2ceccd6 #2725: Various improvements to chat API 7ed4c41d #2723: Improved Send Command
188 lines
8.5 KiB
Diff
188 lines
8.5 KiB
Diff
From e07ab170b66d0c97f45a071d1edcd2dc915e3adb Mon Sep 17 00:00:00 2001
|
|
From: Tux <write@imaginarycode.com>
|
|
Date: Wed, 21 Dec 2016 03:13:03 -0500
|
|
Subject: [PATCH] Optionally use async Netty DNS resolver
|
|
|
|
We no longer need to cache the address for the session server now.
|
|
|
|
diff --git a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
index 9218f31f..5a39c597 100644
|
|
--- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
|
|
@@ -197,6 +197,13 @@ public interface ProxyConfig
|
|
*/
|
|
String getGameVersion();
|
|
|
|
+ /**
|
|
+ * Whether Netty's async DNS resolver is used for account authentication.
|
|
+ *
|
|
+ * @return whether Netty's async DNS resolver is used for account authentication.
|
|
+ */
|
|
+ boolean isUseNettyDnsResolver();
|
|
+
|
|
// Throttling options
|
|
|
|
/**
|
|
diff --git a/proxy/pom.xml b/proxy/pom.xml
|
|
index cbf7a379..548b6bb9 100644
|
|
--- a/proxy/pom.xml
|
|
+++ b/proxy/pom.xml
|
|
@@ -41,6 +41,14 @@
|
|
<version>${netty.version}</version>
|
|
<scope>compile</scope>
|
|
</dependency>
|
|
+ <!-- Waterfall Start - add Netty DNS resolver -->
|
|
+ <dependency>
|
|
+ <groupId>io.netty</groupId>
|
|
+ <artifactId>netty-resolver-dns</artifactId>
|
|
+ <version>${netty.version}</version>
|
|
+ <scope>compile</scope>
|
|
+ </dependency>
|
|
+ <!-- Waterfall End -->
|
|
<dependency>
|
|
<groupId>io.netty</groupId>
|
|
<artifactId>netty-handler</artifactId>
|
|
diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
index 111404fb..ef44d334 100644
|
|
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
|
|
@@ -15,6 +15,12 @@ public class WaterfallConfiguration extends Configuration {
|
|
*/
|
|
private String gameVersion;
|
|
|
|
+ /**
|
|
+ * Whether we use Netty's async DNS resolver for the HttpClient.
|
|
+ * <p>Default is true (use Netty's async DNS resolver)</p>
|
|
+ */
|
|
+ private boolean useNettyDnsResolver = true;
|
|
+
|
|
/*
|
|
* Throttling options
|
|
* Helps prevent players from overloading the servers behind us
|
|
@@ -35,6 +41,7 @@ public class WaterfallConfiguration extends Configuration {
|
|
YamlConfig config = new YamlConfig(new File("waterfall.yml"));
|
|
config.load(false); // Load, but no permissions
|
|
gameVersion = config.getString("game_version", "").isEmpty() ? Joiner.on(", ").join(ProtocolConstants.SUPPORTED_VERSIONS) : config.getString("game_version", "");
|
|
+ useNettyDnsResolver = config.getBoolean("use_netty_dns_resolver", useNettyDnsResolver);
|
|
// Throttling options
|
|
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
|
|
disableModernTabLimiter = config.getBoolean("disable_modern_tab_limiter", disableModernTabLimiter);
|
|
@@ -45,6 +52,11 @@ public class WaterfallConfiguration extends Configuration {
|
|
return gameVersion;
|
|
}
|
|
|
|
+ @Override
|
|
+ public boolean isUseNettyDnsResolver() {
|
|
+ return useNettyDnsResolver;
|
|
+ }
|
|
+
|
|
@Override
|
|
public int getTabThrottle() {
|
|
return tabThrottle;
|
|
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 f95d5b6f..6b44b37e 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
|
|
@@ -28,6 +28,10 @@ public class HttpClient
|
|
|
|
public static final int TIMEOUT = 5000;
|
|
private static final Cache<String, InetAddress> addressCache = CacheBuilder.newBuilder().expireAfterWrite( 1, TimeUnit.MINUTES ).build();
|
|
+ // Waterfall Start - optionally use async resolver from Netty
|
|
+ private static final io.netty.resolver.dns.DnsAddressResolverGroup dnsResolverGroup =
|
|
+ new io.netty.resolver.dns.DnsAddressResolverGroup(PipelineUtils.getDatagramChannel(), io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider.INSTANCE);
|
|
+ // Waterfall End
|
|
|
|
@SuppressWarnings("UnusedAssignment")
|
|
public static void get(String url, EventLoop eventLoop, final Callback<String> callback)
|
|
@@ -57,19 +61,21 @@ public class HttpClient
|
|
}
|
|
}
|
|
|
|
- InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
- if ( inetHost == null )
|
|
- {
|
|
- try
|
|
- {
|
|
- inetHost = InetAddress.getByName( uri.getHost() );
|
|
- } catch ( UnknownHostException ex )
|
|
- {
|
|
- callback.done( null, ex );
|
|
- return;
|
|
- }
|
|
- addressCache.put( uri.getHost(), inetHost );
|
|
- }
|
|
+ // Waterfall Start - Move address creation to implementation method
|
|
+ //InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
+ //if ( inetHost == null )
|
|
+ //{
|
|
+ // try
|
|
+ // {
|
|
+ // inetHost = InetAddress.getByName( uri.getHost() );
|
|
+ // } catch ( UnknownHostException ex )
|
|
+ // {
|
|
+ // callback.done( null, ex );
|
|
+ // return;
|
|
+ // }
|
|
+ // addressCache.put( uri.getHost(), inetHost );
|
|
+ //}
|
|
+ // Waterfall End
|
|
|
|
ChannelFutureListener future = new ChannelFutureListener()
|
|
{
|
|
@@ -92,7 +98,39 @@ public class HttpClient
|
|
}
|
|
};
|
|
|
|
+ // Waterfall Start - Optionally use Netty's async DNS Resolver
|
|
+ if (net.md_5.bungee.api.ProxyServer.getInstance().getConfig().isUseNettyDnsResolver()) {
|
|
+ getWithNettyResolver(eventLoop, uri, port, future, callback, ssl);
|
|
+ } else {
|
|
+ getWithDefaultResolver(eventLoop, uri, port, future, callback, ssl);
|
|
+ }
|
|
+ //new Bootstrap().channel( PipelineUtils.getChannel() ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
+ // option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).remoteAddress( inetHost, port ).connect().addListener( future );
|
|
+ }
|
|
+
|
|
+ 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() ).group( eventLoop ).handler( new HttpInitializer( callback, ssl, uri.getHost(), port ) ).
|
|
+ option( ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT ).resolver(dnsResolverGroup).remoteAddress( address ).connect().addListener( future );
|
|
+ }
|
|
+
|
|
+ private static void getWithDefaultResolver(EventLoop eventLoop, URI uri, int port, ChannelFutureListener future, Callback<String> callback, boolean ssl) {
|
|
+ // This is identical to the Bungee implementation of #get other than the absence of the ChannelFutureListener creation
|
|
+ InetAddress inetHost = addressCache.getIfPresent( uri.getHost() );
|
|
+ if ( inetHost == null )
|
|
+ {
|
|
+ try
|
|
+ {
|
|
+ inetHost = InetAddress.getByName( uri.getHost() );
|
|
+ } catch ( UnknownHostException ex )
|
|
+ {
|
|
+ callback.done( null, ex );
|
|
+ return;
|
|
+ }
|
|
+ addressCache.put( uri.getHost(), inetHost );
|
|
+ }
|
|
new Bootstrap().channel( PipelineUtils.getChannel() ).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 6c418567..23241d68 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
|
|
@@ -119,7 +119,7 @@ public class PipelineUtils
|
|
return epoll ? EpollSocketChannel.class : NioSocketChannel.class;
|
|
}
|
|
|
|
- public static Class<? extends Channel> getDatagramChannel()
|
|
+ public static Class<? extends io.netty.channel.socket.DatagramChannel> getDatagramChannel() // Waterfall - change to DatagramChannel
|
|
{
|
|
return epoll ? EpollDatagramChannel.class : NioDatagramChannel.class;
|
|
}
|
|
--
|
|
2.24.1
|
|
|