2019-04-23 10:09:26 +02:00
From b6c3ccafa8e2479faa7bb5077b90219a4d20ff69 Mon Sep 17 00:00:00 2001
2017-07-26 19:52:48 +02:00
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
2019-04-23 10:09:26 +02:00
index db615ed9..af93ae8c 100644
2017-07-26 19:52:48 +02:00
--- a/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
+++ b/api/src/main/java/net/md_5/bungee/api/ProxyConfig.java
2019-04-23 10:09:26 +02:00
@@ -176,6 +176,13 @@ public interface ProxyConfig
2017-07-26 19:52:48 +02:00
*/
String getGameVersion();
+ /**
+ * Whether Netty's async DNS resolver is used for account authentication.
2019-03-30 17:09:06 +01:00
+ *
+ * @return whether Netty's async DNS resolver is used for account authentication.
2017-07-26 19:52:48 +02:00
+ */
+ boolean isUseNettyDnsResolver();
+
// Throttling options
/**
diff --git a/proxy/pom.xml b/proxy/pom.xml
2019-04-23 10:09:26 +02:00
index 5a81d36f..e637cf99 100644
2017-07-26 19:52:48 +02:00
--- 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
2019-03-30 19:01:17 +01:00
index 111404fb..ef44d334 100644
2017-07-26 19:52:48 +02:00
--- a/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
+++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/conf/WaterfallConfiguration.java
2019-03-30 19:01:17 +01:00
@@ -15,6 +15,12 @@ public class WaterfallConfiguration extends Configuration {
2018-07-22 18:40:31 +02:00
*/
2017-07-26 19:52:48 +02:00
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
2019-03-30 19:01:17 +01:00
@@ -35,6 +41,7 @@ public class WaterfallConfiguration extends Configuration {
YamlConfig config = new YamlConfig(new File("waterfall.yml"));
2018-07-22 18:40:31 +02:00
config.load(false); // Load, but no permissions
2017-07-26 19:52:48 +02:00
gameVersion = config.getString("game_version", "").isEmpty() ? Joiner.on(", ").join(ProtocolConstants.SUPPORTED_VERSIONS) : config.getString("game_version", "");
+ useNettyDnsResolver = config.getBoolean("use_netty_dns_resolver", useNettyDnsResolver);
2018-07-22 18:40:31 +02:00
// Throttling options
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
2018-10-06 20:54:52 +02:00
disableModernTabLimiter = config.getBoolean("disable_modern_tab_limiter", disableModernTabLimiter);
2019-03-30 19:01:17 +01:00
@@ -45,6 +52,11 @@ public class WaterfallConfiguration extends Configuration {
2018-07-22 18:40:31 +02:00
return gameVersion;
2017-07-26 19:52:48 +02:00
}
2018-07-22 18:40:31 +02:00
+ @Override
+ public boolean isUseNettyDnsResolver() {
+ return useNettyDnsResolver;
+ }
+
2017-07-26 19:52:48 +02:00
@Override
2018-07-22 18:40:31 +02:00
public int getTabThrottle() {
return tabThrottle;
2017-07-26 19:52:48 +02:00
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
2017-08-18 11:36:42 +02:00
index 2feb4d66..b265bb43 100644
2017-07-26 19:52:48 +02:00
--- 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
2019-04-23 10:09:26 +02:00
index 6c418567..23241d68 100644
2017-07-26 19:52:48 +02:00
--- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java
+++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java
2018-12-27 00:40:37 +01:00
@@ -119,7 +119,7 @@ public class PipelineUtils
2017-07-26 19:52:48 +02:00
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;
}
--
2019-03-30 17:09:06 +01:00
2.21.0
2017-07-26 19:52:48 +02:00