This commit is contained in:
md_5 2013-06-20 19:23:30 +10:00
parent 0503dd73fd
commit 715a18a7d9

View File

@ -1,4 +1,4 @@
From 184b38aa96c6eb71116c452bff126cd7df9db814 Mon Sep 17 00:00:00 2001 From da93c0bd48b4e34c4561ba975e7561cf60be9ef0 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au> From: md_5 <md_5@live.com.au>
Date: Tue, 23 Apr 2013 11:47:32 +1000 Date: Tue, 23 Apr 2013 11:47:32 +1000
Subject: [PATCH] Netty Subject: [PATCH] Netty
@ -236,14 +236,13 @@ index 2567bde..7f5f3ea 100644
} }
diff --git a/src/main/java/org/spigotmc/MultiplexingServerConnection.java b/src/main/java/org/spigotmc/MultiplexingServerConnection.java diff --git a/src/main/java/org/spigotmc/MultiplexingServerConnection.java b/src/main/java/org/spigotmc/MultiplexingServerConnection.java
new file mode 100644 new file mode 100644
index 0000000..c8ea80a index 0000000..386c2f8
--- /dev/null --- /dev/null
+++ b/src/main/java/org/spigotmc/MultiplexingServerConnection.java +++ b/src/main/java/org/spigotmc/MultiplexingServerConnection.java
@@ -0,0 +1,126 @@ @@ -0,0 +1,136 @@
+package org.spigotmc; +package org.spigotmc;
+ +
+import java.net.InetAddress; +import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.ArrayList; +import java.util.ArrayList;
+import java.util.Collection; +import java.util.Collection;
+import java.util.Collections; +import java.util.Collections;
@ -257,41 +256,38 @@ index 0000000..c8ea80a
+import net.minecraft.server.ServerConnection; +import net.minecraft.server.ServerConnection;
+import org.bukkit.Bukkit; +import org.bukkit.Bukkit;
+ +
+public class MultiplexingServerConnection extends ServerConnection { +public class MultiplexingServerConnection extends ServerConnection
+{
+ +
+ private static final boolean NETTY_DISABLED = Boolean.getBoolean("org.spigotmc.netty.disabled");
+ private final Collection<ServerConnection> children = new HashSet<ServerConnection>(); + private final Collection<ServerConnection> children = new HashSet<ServerConnection>();
+ private final List<PendingConnection> pending = Collections.synchronizedList(new ArrayList<PendingConnection>()); + private final List<PendingConnection> pending = Collections.synchronizedList( new ArrayList<PendingConnection>() );
+ private final HashMap<InetAddress, Long> throttle = new HashMap<InetAddress, Long>(); + private final HashMap<InetAddress, Long> throttle = new HashMap<InetAddress, Long>();
+ +
+ public MultiplexingServerConnection(MinecraftServer ms) { + public MultiplexingServerConnection(MinecraftServer ms)
+ super(ms); + {
+ super( ms );
+ +
+ // Add primary connection + for ( SpigotConfig.Listener listener : SpigotConfig.listeners )
+ start(ms.server.getIp(), ms.server.getPort()); + {
+ // Add all other connections + try
+ for (InetSocketAddress address : ms.server.getSecondaryHosts()) { + {
+ start(address.getAddress().getHostAddress(), address.getPort());
+ }
+ }
+
+ private void start(String ipAddress, int port) {
+ try {
+ // Calculate address, can't use isEmpty due to Java 5 + // Calculate address, can't use isEmpty due to Java 5
+ InetAddress socketAddress = (ipAddress.length() == 0) ? null : InetAddress.getByName(ipAddress); + InetAddress socketAddress = ( listener.host.length() == 0 ) ? null : InetAddress.getByName( listener.host );
+ // Say hello to the log + // Say hello to the log
+ d().getLogger().info("Starting listener #" + children.size() + " on " + (socketAddress == null ? "*" : ipAddress) + ":" + port); + d().getLogger().info( "Starting listener #" + children.size() + " on " + ( socketAddress == null ? "*" : listener.host ) + ":" + listener.port );
+ // Start connection: Netty / non Netty + // Start connection: Netty / non Netty
+ ServerConnection listener = (NETTY_DISABLED) ? new DedicatedServerConnection(d(), socketAddress, port) : new org.spigotmc.netty.NettyServerConnection(d(), socketAddress, port); + ServerConnection l = ( listener.netty ) ? new DedicatedServerConnection( d(), socketAddress, listener.port ) : new org.spigotmc.netty.NettyServerConnection( d(), socketAddress, listener.port );
+ // Register with other connections + // Register with other connections
+ children.add(listener); + children.add( l );
+ // Gotta catch em all + // Gotta catch em all
+ } catch (Throwable t) { + } catch ( Throwable t )
+ {
+ // Just print some info to the log + // Just print some info to the log
+ t.printStackTrace(); + t.printStackTrace();
+ d().getLogger().warning("**** FAILED TO BIND TO PORT!"); + d().getLogger().warning( "**** FAILED TO BIND TO PORT!" );
+ d().getLogger().warning("The exception was: {0}", t); + d().getLogger().warning( "The exception was: {0}", t );
+ d().getLogger().warning("Perhaps a server is already running on that port?"); + d().getLogger().warning( "Perhaps a server is already running on that port?" );
+ }
+ } + }
+ } + }
+ +
@ -299,8 +295,10 @@ index 0000000..c8ea80a
+ * close. + * close.
+ */ + */
+ @Override + @Override
+ public void a() { + public void a()
+ for (ServerConnection child : children) { + {
+ for ( ServerConnection child : children )
+ {
+ child.a(); + child.a();
+ } + }
+ } + }
@ -310,20 +308,25 @@ index 0000000..c8ea80a
+ * called from the main server thread a few times a tick. + * called from the main server thread a few times a tick.
+ */ + */
+ @Override + @Override
+ public void b() { + public void b()
+ {
+ super.b(); // pulse PlayerConnections + super.b(); // pulse PlayerConnections
+ for (int i = 0; i < pending.size(); ++i) { + for ( int i = 0; i < pending.size(); ++i )
+ PendingConnection connection = pending.get(i); + {
+ PendingConnection connection = pending.get( i );
+ +
+ try { + try
+ {
+ connection.c(); + connection.c();
+ } catch (Exception ex) { + } catch ( Exception ex )
+ connection.disconnect("Internal server error"); + {
+ Bukkit.getServer().getLogger().log(Level.WARNING, "Failed to handle packet: " + ex, ex); + connection.disconnect( "Internal server error" );
+ Bukkit.getServer().getLogger().log( Level.WARNING, "Failed to handle packet: " + ex, ex );
+ } + }
+ +
+ if (connection.b) { + if ( connection.b )
+ pending.remove(i--); + {
+ pending.remove( i-- );
+ } + }
+ } + }
+ } + }
@ -334,10 +337,13 @@ index 0000000..c8ea80a
+ * + *
+ * @param address the address to remove + * @param address the address to remove
+ */ + */
+ public void unThrottle(InetAddress address) { + public void unThrottle(InetAddress address)
+ if (address != null) { + {
+ synchronized (throttle) { + if ( address != null )
+ throttle.remove(address); + {
+ synchronized ( throttle )
+ {
+ throttle.remove( address );
+ } + }
+ } + }
+ } + }
@ -348,24 +354,89 @@ index 0000000..c8ea80a
+ * @param address + * @param address
+ * @return Whether they must be disconnected + * @return Whether they must be disconnected
+ */ + */
+ public boolean throttle(InetAddress address) { + public boolean throttle(InetAddress address)
+ {
+ long currentTime = System.currentTimeMillis(); + long currentTime = System.currentTimeMillis();
+ synchronized (throttle) { + synchronized ( throttle )
+ Long value = throttle.get(address); + {
+ if (value != null && !address.isLoopbackAddress() && currentTime - value < d().server.getConnectionThrottle()) { + Long value = throttle.get( address );
+ throttle.put(address, currentTime); + if ( value != null && !address.isLoopbackAddress() && currentTime - value < d().server.getConnectionThrottle() )
+ {
+ throttle.put( address, currentTime );
+ return true; + return true;
+ } + }
+ +
+ throttle.put(address, currentTime); + throttle.put( address, currentTime );
+ } + }
+ return false; + return false;
+ } + }
+ +
+ public void register(PendingConnection conn) { + public void register(PendingConnection conn)
+ pending.add(conn); + {
+ pending.add( conn );
+ } + }
+} +}
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
index 2fe3a5d..90d3193 100644
--- a/src/main/java/org/spigotmc/SpigotConfig.java
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
@@ -6,6 +6,11 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -130,4 +135,44 @@ public class SpigotConfig
restartScript = getString( "settings.restart-script", restartScript );
WatchdogThread.doStart( timeoutTime, restartOnCrash );
}
+
+ public static class Listener
+ {
+
+ public String host;
+ public int port;
+ public boolean netty;
+ public long connectionThrottle;
+
+ public Listener(String host, int port, boolean netty, long connectionThrottle)
+ {
+ this.host = host;
+ this.port = port;
+ this.netty = netty;
+ this.connectionThrottle = connectionThrottle;
+ }
+ }
+ public static List<Listener> listeners = new ArrayList<Listener>();
+ private void listeners()
+ {
+ Map<String, Object> def = new HashMap<String, Object>();
+ def.put( "host", "default" );
+ def.put( "port", "default" );
+ def.put( "netty", true );
+ def.put( "throttle", "default" );
+
+ config.addDefault( "listeners", Collections.singletonList( def ) );
+ for ( Map<String, Object> info : (List<Map<String, Object>>) config.getList( "listeners" ) )
+ {
+ String host = (String) info.get( "host" );
+ if ( "default".equals( host ) )
+ {
+ host = Bukkit.getIp();
+ }
+ int port = ( info.get( "port" ) instanceof Integer ) ? (Integer) info.get( "port" ) : Bukkit.getPort();
+ boolean netty = (Boolean) info.get( "netty" );
+ long connectionThrottle = ( info.get( "throttle" ) instanceof Number ) ? ( (Number) info.get( "throttle" ) ).longValue() : Bukkit.getConnectionThrottle();
+ this.listeners.add( new Listener( host, port, netty, connectionThrottle ) );
+ }
+ }
}
diff --git a/src/main/java/org/spigotmc/netty/CipherBase.java b/src/main/java/org/spigotmc/netty/CipherBase.java diff --git a/src/main/java/org/spigotmc/netty/CipherBase.java b/src/main/java/org/spigotmc/netty/CipherBase.java
new file mode 100644 new file mode 100644
index 0000000..c75a60f index 0000000..c75a60f