Remove multiplexing server connection as we do not need it with 1.6

This commit is contained in:
md_5 2013-07-02 09:05:40 +10:00
parent 64a3e2baa5
commit ad45efc6ce

View File

@ -1,6 +1,6 @@
From 63e4928a2de937251118a9fbb8fedf38f795f152 Mon Sep 17 00:00:00 2001 From c4cd485055df9b6ca52728e8c119c76592acc7c5 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au> From: md_5 <md_5@live.com.au>
Date: Sun, 23 Jun 2013 16:32:51 +1000 Date: Tue, 2 Jul 2013 09:05:20 +1000
Subject: [PATCH] Netty Subject: [PATCH] Netty
@ -26,60 +26,22 @@ index 8c9f66b..f1a4d4c 100644
<!-- This builds a completely 'ready to start' jar with all dependencies inside --> <!-- This builds a completely 'ready to start' jar with all dependencies inside -->
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index 59444cb..9e6e318 100644 index 59444cb..121ed89 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java --- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -97,10 +97,12 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer @@ -100,7 +100,11 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
this.getLogger().info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.G());
this.getLogger().info("Generating keypair");
this.a(MinecraftEncryption.b());
- this.getLogger().info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.G());
+ // Spigot start
+ // this.getLogger().info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.G());
try { try {
- this.r = new DedicatedServerConnection(this, inetaddress, this.G()); - this.r = new DedicatedServerConnection(this, inetaddress, this.G());
+ this.r = new org.spigotmc.MultiplexingServerConnection(this); + // Spigot start
+ this.r = ( org.spigotmc.SpigotConfig.listeners.get( 0 ).netty )
+ ? new org.spigotmc.netty.NettyServerConnection( this, inetaddress, this.G() )
+ : new DedicatedServerConnection( this, inetaddress, this.G() );
+ // Spigot end + // Spigot end
} catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable } catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable
this.getLogger().warning("**** FAILED TO BIND TO PORT!"); this.getLogger().warning("**** FAILED TO BIND TO PORT!");
this.getLogger().warning("The exception was: {0}", new Object[] { ioexception.toString()}); this.getLogger().warning("The exception was: {0}", new Object[] { ioexception.toString()});
diff --git a/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java
index ef7e10d..e25819d 100644
--- a/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java
+++ b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java
@@ -66,23 +66,19 @@ public class DedicatedServerConnectionThread extends Thread {
socket.close();
continue;
}
+ // CraftBukkit end
- connectionThrottle = ((MinecraftServer) this.e.d()).server.getConnectionThrottle();
-
- synchronized (this.b) {
- if (this.b.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - ((Long) this.b.get(address)).longValue() < connectionThrottle) {
- this.b.put(address, Long.valueOf(currentTime));
- socket.close();
- continue;
- }
-
- this.b.put(address, Long.valueOf(currentTime));
+ // Spigot Start
+ if ( ( (org.spigotmc.MultiplexingServerConnection) MinecraftServer.getServer().ae() ).throttle( address ) )
+ {
+ socket.close();
+ continue;
}
- // CraftBukkit end
+ // Spigot end
PendingConnection pendingconnection = new PendingConnection(this.e.d(), socket, "Connection #" + this.c++);
- this.a(pendingconnection);
+ ((org.spigotmc.MultiplexingServerConnection) this.e.d().ae()).register(pendingconnection); // Spigot
} catch (IOException ioexception) {
this.e.d().getLogger().warning("DSCT: " + ioexception.getMessage()); // CraftBukkit
}
diff --git a/src/main/java/net/minecraft/server/INetworkManager.java b/src/main/java/net/minecraft/server/INetworkManager.java diff --git a/src/main/java/net/minecraft/server/INetworkManager.java b/src/main/java/net/minecraft/server/INetworkManager.java
new file mode 100644 new file mode 100644
index 0000000..6fcc5d7 index 0000000..6fcc5d7
@ -159,7 +121,7 @@ index a2cd9b0..f586415 100644
}; };
// CraftBukkit end // CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/PendingConnection.java b/src/main/java/net/minecraft/server/PendingConnection.java diff --git a/src/main/java/net/minecraft/server/PendingConnection.java b/src/main/java/net/minecraft/server/PendingConnection.java
index 17cfacc..a945892 100644 index 17cfacc..292fa49 100644
--- a/src/main/java/net/minecraft/server/PendingConnection.java --- a/src/main/java/net/minecraft/server/PendingConnection.java
+++ b/src/main/java/net/minecraft/server/PendingConnection.java +++ b/src/main/java/net/minecraft/server/PendingConnection.java
@@ -17,7 +17,7 @@ public class PendingConnection extends Connection { @@ -17,7 +17,7 @@ public class PendingConnection extends Connection {
@ -197,179 +159,29 @@ index 17cfacc..a945892 100644
// CraftBukkit start - Fix decompile issues, don't create a list from an array // CraftBukkit start - Fix decompile issues, don't create a list from an array
Object[] list = new Object[] { 1, 61, this.server.getVersion(), pingEvent.getMotd(), playerlist.getPlayerCount(), pingEvent.getMaxPlayers() }; Object[] list = new Object[] { 1, 61, this.server.getVersion(), pingEvent.getMotd(), playerlist.getPlayerCount(), pingEvent.getMaxPlayers() };
@@ -173,9 +178,11 @@ public class PendingConnection extends Connection { @@ -173,9 +178,18 @@ public class PendingConnection extends Connection {
this.networkManager.queue(new Packet255KickDisconnect(s)); this.networkManager.queue(new Packet255KickDisconnect(s));
this.networkManager.d(); this.networkManager.d();
- if (inetaddress != null && this.server.ae() instanceof DedicatedServerConnection) { - if (inetaddress != null && this.server.ae() instanceof DedicatedServerConnection) {
- ((DedicatedServerConnection) this.server.ae()).a(inetaddress); - ((DedicatedServerConnection) this.server.ae()).a(inetaddress);
+ // Spigot start + // Spigot start
+ if (inetaddress != null) { + if ( inetaddress != null )
+ ((org.spigotmc.MultiplexingServerConnection) this.server.ae()).unThrottle(inetaddress); + {
+ if ( this.server.ae() instanceof DedicatedServerConnection )
+ {
+ ((DedicatedServerConnection) this.server.ae()).a(inetaddress);
+ } else
+ {
+ ((org.spigotmc.netty.NettyServerConnection)this.server.ae()).unThrottle( inetaddress );
+ }
} }
+ // Spigot end + // Spigot end
this.b = true; this.b = true;
} catch (Exception exception) { } catch (Exception exception) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 6e6fe1c..68694de 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1369,4 +1369,20 @@ public final class CraftServer implements Server {
public CraftScoreboardManager getScoreboardManager() {
return scoreboardManager;
}
+
+ // Spigot start
+ @SuppressWarnings("unchecked")
+ public java.util.Collection<java.net.InetSocketAddress> getSecondaryHosts() {
+ java.util.Collection<java.net.InetSocketAddress> ret = new java.util.HashSet<java.net.InetSocketAddress>();
+ List<?> listeners = configuration.getList("listeners");
+ if (listeners != null) {
+ for (Object o : listeners) {
+
+ Map<String, Object> sect = (Map<String, Object>) o;
+ ret.add(new java.net.InetSocketAddress((String) sect.get("address"), (Integer) sect.get("port")));
+ }
+ }
+ return ret;
+ }
+ // Spigot end
}
diff --git a/src/main/java/org/spigotmc/MultiplexingServerConnection.java b/src/main/java/org/spigotmc/MultiplexingServerConnection.java
new file mode 100644
index 0000000..abe5e0c
--- /dev/null
+++ b/src/main/java/org/spigotmc/MultiplexingServerConnection.java
@@ -0,0 +1,126 @@
+package org.spigotmc;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import net.minecraft.server.DedicatedServerConnection;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.PendingConnection;
+import net.minecraft.server.ServerConnection;
+import org.bukkit.Bukkit;
+import org.spigotmc.netty.NettyServerConnection;
+
+public class MultiplexingServerConnection extends ServerConnection
+{
+
+ private final Collection<ServerConnection> children = new HashSet<ServerConnection>();
+ private final List<PendingConnection> pending = Collections.synchronizedList( new ArrayList<PendingConnection>() );
+ private final HashMap<InetAddress, Long> throttle = new HashMap<InetAddress, Long>();
+
+ public MultiplexingServerConnection(MinecraftServer ms) throws Throwable
+ {
+ super( ms );
+
+ for ( SpigotConfig.Listener listener : SpigotConfig.listeners )
+ {
+ // Calculate address, can't use isEmpty due to Java 5
+ InetAddress socketAddress = ( listener.host.length() == 0 ) ? null : InetAddress.getByName( listener.host );
+ // Say hello to the log
+ d().getLogger().info( "Starting listener #" + children.size() + " on " + ( socketAddress == null ? "*" : listener.host ) + ":" + listener.port );
+ // Start connection: Netty / non Netty
+ ServerConnection l = ( listener.netty ) ? new NettyServerConnection( d(), socketAddress, listener.port ) : new DedicatedServerConnection( d(), socketAddress, listener.port );
+ // Register with other connections
+ children.add( l );
+ }
+ }
+
+ /**
+ * close.
+ */
+ @Override
+ public void a()
+ {
+ for ( ServerConnection child : children )
+ {
+ child.a();
+ }
+ }
+
+ /**
+ * Pulse. This method pulses all connections causing them to update. It is
+ * called from the main server thread a few times a tick.
+ */
+ @Override
+ public void b()
+ {
+ super.b(); // pulse PlayerConnections
+ for ( int i = 0; i < pending.size(); ++i )
+ {
+ PendingConnection connection = pending.get( i );
+
+ try
+ {
+ connection.c();
+ } catch ( Exception ex )
+ {
+ connection.disconnect( "Internal server error" );
+ Bukkit.getServer().getLogger().log( Level.WARNING, "Failed to handle packet: " + ex, ex );
+ }
+
+ if ( connection.b )
+ {
+ pending.remove( i-- );
+ }
+ }
+ }
+
+ /**
+ * Remove the user from connection throttle. This should fix the server ping
+ * bugs.
+ *
+ * @param address the address to remove
+ */
+ public void unThrottle(InetAddress address)
+ {
+ if ( address != null )
+ {
+ synchronized ( throttle )
+ {
+ throttle.remove( address );
+ }
+ }
+ }
+
+ /**
+ * Add a connection to the throttle list.
+ *
+ * @param address
+ * @return Whether they must be disconnected
+ */
+ public boolean throttle(InetAddress address)
+ {
+ long currentTime = System.currentTimeMillis();
+ synchronized ( throttle )
+ {
+ Long value = throttle.get( address );
+ if ( value != null && !address.isLoopbackAddress() && currentTime - value < d().server.getConnectionThrottle() )
+ {
+ throttle.put( address, currentTime );
+ return true;
+ }
+
+ throttle.put( address, currentTime );
+ }
+ return false;
+ }
+
+ public void register(PendingConnection conn)
+ {
+ pending.add( conn );
+ }
+}
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
index a0a7790..8b7e48e 100644 index a0a7790..c6ec91b 100644
--- a/src/main/java/org/spigotmc/SpigotConfig.java --- a/src/main/java/org/spigotmc/SpigotConfig.java
+++ b/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java
@@ -6,6 +6,8 @@ import java.io.IOException; @@ -6,6 +6,8 @@ import java.io.IOException;
@ -381,7 +193,7 @@ index a0a7790..8b7e48e 100644
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -148,4 +150,47 @@ public class SpigotConfig @@ -148,4 +150,61 @@ public class SpigotConfig
commands.put( "restart", new RestartCommand( "restart" ) ); commands.put( "restart", new RestartCommand( "restart" ) );
WatchdogThread.doStart( timeoutTime, restartOnCrash ); WatchdogThread.doStart( timeoutTime, restartOnCrash );
} }
@ -404,6 +216,7 @@ index a0a7790..8b7e48e 100644
+ } + }
+ public static List<Listener> listeners = new ArrayList<Listener>(); + public static List<Listener> listeners = new ArrayList<Listener>();
+ public static int nettyThreads; + public static int nettyThreads;
+
+ private static void listeners() + private static void listeners()
+ { + {
+ Map<String, Object> def = new HashMap<String, Object>(); + Map<String, Object> def = new HashMap<String, Object>();
@ -419,12 +232,25 @@ index a0a7790..8b7e48e 100644
+ if ( "default".equals( host ) ) + if ( "default".equals( host ) )
+ { + {
+ host = Bukkit.getIp(); + host = Bukkit.getIp();
+ } else
+ {
+ throw new IllegalArgumentException( "Can only bind listener to default! Configure it in server.properties" );
+ }
+ int port ;
+
+ if (info.get( "port" ) instanceof Integer){
+ throw new IllegalArgumentException( "Can only bind port to default! Configure it in server.properties");
+ } else{
+ port = Bukkit.getPort();
+ } + }
+ int port = ( info.get( "port" ) instanceof Integer ) ? (Integer) info.get( "port" ) : Bukkit.getPort();
+ boolean netty = (Boolean) info.get( "netty" ); + boolean netty = (Boolean) info.get( "netty" );
+ // long connectionThrottle = ( info.get( "throttle" ) instanceof Number ) ? ( (Number) info.get( "throttle" ) ).longValue() : Bukkit.getConnectionThrottle(); + // long connectionThrottle = ( info.get( "throttle" ) instanceof Number ) ? ( (Number) info.get( "throttle" ) ).longValue() : Bukkit.getConnectionThrottle();
+ listeners.add( new Listener( host, port, netty, Bukkit.getConnectionThrottle() ) ); + listeners.add( new Listener( host, port, netty, Bukkit.getConnectionThrottle() ) );
+ } + }
+ if ( listeners.size() != 1 )
+ {
+ throw new IllegalArgumentException( "May only have one listener!" );
+ }
+ +
+ nettyThreads = getInt( "settings.netty-threads", 3 ); + nettyThreads = getInt( "settings.netty-threads", 3 );
+ } + }
@ -569,10 +395,10 @@ index 0000000..2eb1dcb
+} +}
diff --git a/src/main/java/org/spigotmc/netty/NettyNetworkManager.java b/src/main/java/org/spigotmc/netty/NettyNetworkManager.java diff --git a/src/main/java/org/spigotmc/netty/NettyNetworkManager.java b/src/main/java/org/spigotmc/netty/NettyNetworkManager.java
new file mode 100644 new file mode 100644
index 0000000..b52acba index 0000000..5e2b104
--- /dev/null --- /dev/null
+++ b/src/main/java/org/spigotmc/netty/NettyNetworkManager.java +++ b/src/main/java/org/spigotmc/netty/NettyNetworkManager.java
@@ -0,0 +1,315 @@ @@ -0,0 +1,314 @@
+package org.spigotmc.netty; +package org.spigotmc.netty;
+ +
+import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.common.util.concurrent.ThreadFactoryBuilder;
@ -600,7 +426,6 @@ index 0000000..b52acba
+import net.minecraft.server.Packet255KickDisconnect; +import net.minecraft.server.Packet255KickDisconnect;
+import net.minecraft.server.PendingConnection; +import net.minecraft.server.PendingConnection;
+import net.minecraft.server.PlayerConnection; +import net.minecraft.server.PlayerConnection;
+import org.spigotmc.MultiplexingServerConnection;
+ +
+/** +/**
+ * This class forms the basis of the Netty integration. It implements + * This class forms the basis of the Netty integration. It implements
@ -613,7 +438,7 @@ index 0000000..b52acba
+ private static final ExecutorService threadPool = Executors.newCachedThreadPool( new ThreadFactoryBuilder().setNameFormat( "Async Packet Handler - %1$d" ).build() ); + private static final ExecutorService threadPool = Executors.newCachedThreadPool( new ThreadFactoryBuilder().setNameFormat( "Async Packet Handler - %1$d" ).build() );
+ private static final MinecraftServer server = MinecraftServer.getServer(); + private static final MinecraftServer server = MinecraftServer.getServer();
+ private static final PrivateKey key = server.F().getPrivate(); + private static final PrivateKey key = server.F().getPrivate();
+ private static final MultiplexingServerConnection serverConnection = (MultiplexingServerConnection) server.ae(); + private static final NettyServerConnection serverConnection = (NettyServerConnection) server.ae();
+ /*========================================================================*/ + /*========================================================================*/
+ private final Queue<Packet> syncPackets = new ConcurrentLinkedQueue<Packet>(); + private final Queue<Packet> syncPackets = new ConcurrentLinkedQueue<Packet>();
+ private final List<Packet> highPriorityQueue = new AbstractList<Packet>() + private final List<Packet> highPriorityQueue = new AbstractList<Packet>()
@ -890,10 +715,10 @@ index 0000000..b52acba
+} +}
diff --git a/src/main/java/org/spigotmc/netty/NettyServerConnection.java b/src/main/java/org/spigotmc/netty/NettyServerConnection.java diff --git a/src/main/java/org/spigotmc/netty/NettyServerConnection.java b/src/main/java/org/spigotmc/netty/NettyServerConnection.java
new file mode 100644 new file mode 100644
index 0000000..1dfb36b index 0000000..b29ca98
--- /dev/null --- /dev/null
+++ b/src/main/java/org/spigotmc/netty/NettyServerConnection.java +++ b/src/main/java/org/spigotmc/netty/NettyServerConnection.java
@@ -0,0 +1,104 @@ @@ -0,0 +1,170 @@
+package org.spigotmc.netty; +package org.spigotmc.netty;
+ +
+import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.common.util.concurrent.ThreadFactoryBuilder;
@ -911,11 +736,18 @@ index 0000000..1dfb36b
+import java.net.InetSocketAddress; +import java.net.InetSocketAddress;
+import java.security.GeneralSecurityException; +import java.security.GeneralSecurityException;
+import java.security.Key; +import java.security.Key;
+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 javax.crypto.Cipher; +import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.IvParameterSpec;
+import net.minecraft.server.MinecraftServer; +import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.PendingConnection;
+import net.minecraft.server.ServerConnection; +import net.minecraft.server.ServerConnection;
+import org.spigotmc.MultiplexingServerConnection; +import org.bukkit.Bukkit;
+import org.spigotmc.SpigotConfig; +import org.spigotmc.SpigotConfig;
+ +
+/** +/**
@ -929,6 +761,36 @@ index 0000000..1dfb36b
+ +
+ private final ChannelFuture socket; + private final ChannelFuture socket;
+ private static EventLoopGroup group; + private static EventLoopGroup group;
+ private final Map<InetAddress, Long> throttle = new HashMap<InetAddress, Long>();
+ private final List<PendingConnection> pending = Collections.synchronizedList( new ArrayList<PendingConnection>() );
+
+ public void unThrottle(InetAddress address)
+ {
+ if ( address != null )
+ {
+ synchronized ( throttle )
+ {
+ throttle.remove( address );
+ }
+ }
+ }
+
+ public boolean throttle(InetAddress address)
+ {
+ long currentTime = System.currentTimeMillis();
+ synchronized ( throttle )
+ {
+ Long value = throttle.get( address );
+ if ( value != null && !address.isLoopbackAddress() && currentTime - value < d().server.getConnectionThrottle() )
+ {
+ throttle.put( address, currentTime );
+ return true;
+ }
+
+ throttle.put( address, currentTime );
+ }
+ return false;
+ }
+ +
+ public NettyServerConnection(final MinecraftServer ms, InetAddress host, int port) + public NettyServerConnection(final MinecraftServer ms, InetAddress host, int port)
+ { + {
@ -944,7 +806,7 @@ index 0000000..1dfb36b
+ public void initChannel(Channel ch) throws Exception + public void initChannel(Channel ch) throws Exception
+ { + {
+ // Check the throttle + // Check the throttle
+ if ( ( (MultiplexingServerConnection) ms.ae() ).throttle( ( (InetSocketAddress) ch.remoteAddress() ).getAddress() ) ) + if ( throttle( ( (InetSocketAddress) ch.remoteAddress() ).getAddress() ) )
+ { + {
+ ch.close(); + ch.close();
+ return; + return;
@ -978,6 +840,35 @@ index 0000000..1dfb36b
+ socket.channel().close().syncUninterruptibly(); + socket.channel().close().syncUninterruptibly();
+ } + }
+ +
+ @Override
+ public void b()
+ {
+ super.b(); // pulse PlayerConnections
+ for ( int i = 0; i < pending.size(); ++i )
+ {
+ PendingConnection connection = pending.get( i );
+
+ try
+ {
+ connection.c();
+ } catch ( Exception ex )
+ {
+ connection.disconnect( "Internal server error" );
+ Bukkit.getServer().getLogger().log( Level.WARNING, "Failed to handle packet: " + ex, ex );
+ }
+
+ if ( connection.b )
+ {
+ pending.remove( i-- );
+ }
+ }
+ }
+
+ public void register(PendingConnection conn)
+ {
+ pending.add( conn );
+ }
+
+ /** + /**
+ * Return a Minecraft compatible cipher instance from the specified key. + * Return a Minecraft compatible cipher instance from the specified key.
+ * + *