Properly handle async calls to restart the server
GH-681
This commit is contained in:
parent
6c3faf6aa3
commit
b0d78d461b
1 changed files with 105 additions and 0 deletions
|
@ -0,0 +1,105 @@
|
|||
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
|
||||
|
Loading…
Reference in a new issue