106 lines
3.4 KiB
Diff
106 lines
3.4 KiB
Diff
|
From 707945410e0af095ceb20fde3ce0eaf085c36c8c Mon Sep 17 00:00:00 2001
|
||
|
From: Zach Brown <zach.brown@destroystokyo.com>
|
||
|
Date: Fri, 12 May 2017 23:34:11 -0500
|
||
|
Subject: [PATCH] Properly handle async calls to restart the server
|
||
|
|
||
|
|
||
|
diff --git a/src/main/java/org/spigotmc/RestartCommand.java b/src/main/java/org/spigotmc/RestartCommand.java
|
||
|
index 49768734d..2361f96d0 100644
|
||
|
--- a/src/main/java/org/spigotmc/RestartCommand.java
|
||
|
+++ b/src/main/java/org/spigotmc/RestartCommand.java
|
||
|
@@ -52,36 +52,7 @@ public class RestartCommand extends Command
|
||
|
// Disable Watchdog
|
||
|
WatchdogThread.doStop();
|
||
|
|
||
|
- // Kick all players
|
||
|
- for ( EntityPlayer p : (List< EntityPlayer>) MinecraftServer.getServer().getPlayerList().players )
|
||
|
- {
|
||
|
- p.playerConnection.disconnect(SpigotConfig.restartMessage);
|
||
|
- }
|
||
|
- // Give the socket a chance to send the packets
|
||
|
- try
|
||
|
- {
|
||
|
- Thread.sleep( 100 );
|
||
|
- } catch ( InterruptedException ex )
|
||
|
- {
|
||
|
- }
|
||
|
- // Close the socket so we can rebind with the new process
|
||
|
- MinecraftServer.getServer().getServerConnection().b();
|
||
|
-
|
||
|
- // Give time for it to kick in
|
||
|
- try
|
||
|
- {
|
||
|
- Thread.sleep( 100 );
|
||
|
- } catch ( InterruptedException ex )
|
||
|
- {
|
||
|
- }
|
||
|
-
|
||
|
- // Actually shutdown
|
||
|
- try
|
||
|
- {
|
||
|
- MinecraftServer.getServer().stop();
|
||
|
- } catch ( Throwable t )
|
||
|
- {
|
||
|
- }
|
||
|
+ shutdownServer(); // Paper - Moved to function that will handle sync and async
|
||
|
|
||
|
// This will be done AFTER the server has completely halted
|
||
|
Thread shutdownHook = new Thread()
|
||
|
@@ -129,4 +100,53 @@ public class RestartCommand extends Command
|
||
|
ex.printStackTrace();
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+ // Paper start - sync copied from above with minor changes, async added
|
||
|
+ private static void shutdownServer()
|
||
|
+ {
|
||
|
+ if (MinecraftServer.getServer().isMainThread())
|
||
|
+ {
|
||
|
+ // Kick all players
|
||
|
+ for ( EntityPlayer p : com.google.common.collect.ImmutableList.copyOf( MinecraftServer.getServer().getPlayerList().players ) )
|
||
|
+ {
|
||
|
+ p.playerConnection.disconnect(SpigotConfig.restartMessage);
|
||
|
+ }
|
||
|
+ // Give the socket a chance to send the packets
|
||
|
+ try
|
||
|
+ {
|
||
|
+ Thread.sleep( 100 );
|
||
|
+ } catch ( InterruptedException ex )
|
||
|
+ {
|
||
|
+ }
|
||
|
+
|
||
|
+ closeSocket();
|
||
|
+
|
||
|
+ // Actually shutdown
|
||
|
+ try
|
||
|
+ {
|
||
|
+ MinecraftServer.getServer().stop();
|
||
|
+ } catch ( Throwable t )
|
||
|
+ {
|
||
|
+ }
|
||
|
+ } else
|
||
|
+ {
|
||
|
+ closeSocket();
|
||
|
+ MinecraftServer.getServer().safeShutdown();
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ // Paper - Split from moved code
|
||
|
+ private static void closeSocket() {
|
||
|
+ // Close the socket so we can rebind with the new process
|
||
|
+ MinecraftServer.getServer().getServerConnection().b();
|
||
|
+
|
||
|
+ // Give time for it to kick in
|
||
|
+ try
|
||
|
+ {
|
||
|
+ Thread.sleep( 100 );
|
||
|
+ } catch ( InterruptedException ex )
|
||
|
+ {
|
||
|
+ }
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
}
|
||
|
--
|
||
|
2.13.0.windows.1
|
||
|
|