mirror of
https://github.com/PaperMC/Waterfall.git
synced 2025-01-19 06:02:02 +01:00
d3dc2d3748
Drop the original console command completion patch and rewrite it for JLine 3. Add support to complete command names instead of just command arguments. The additional single thread executor for command completion was dropped because it's redundant: since the command completer needs to wait for it to complete anyway, we might as well do the completion directly from the console thread.
175 lines
7.9 KiB
Diff
175 lines
7.9 KiB
Diff
From efc2b1364b45ef31545017819c23775e0ad31f41 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 a4436141..43519ce1 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
|
|
@@ -173,6 +173,11 @@ public interface ProxyConfig
|
|
*/
|
|
String getGameVersion();
|
|
|
|
+ /**
|
|
+ * 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 7aedbc45..1a5d036d 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 59835815..7dc3c2d9 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
|
|
@@ -33,6 +33,13 @@ public class WaterfallConfiguration extends Configuration {
|
|
@Getter
|
|
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>
|
|
+ */
|
|
+ @Getter
|
|
+ private boolean useNettyDnsResolver = true;
|
|
+
|
|
/*
|
|
* Throttling options
|
|
* Helps prevent players from overloading the servers behind us
|
|
@@ -56,6 +63,7 @@ public class WaterfallConfiguration extends Configuration {
|
|
// Throttling options
|
|
tabThrottle = config.getInt("throttling.tab_complete", tabThrottle);
|
|
gameVersion = config.getString("game_version", "").isEmpty() ? Joiner.on(", ").join(ProtocolConstants.SUPPORTED_VERSIONS) : config.getString("game_version", "");
|
|
+ useNettyDnsResolver = config.getBoolean("use_netty_dns_resolver", useNettyDnsResolver);
|
|
}
|
|
|
|
@Override
|
|
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 2feb4d66..b265bb43 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 0cad5c89..3af6a1db 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
|
|
@@ -112,7 +112,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.14.1
|
|
|