From d1ceb803d35aa6342e066596fcb22aa24421008b Mon Sep 17 00:00:00 2001 From: miclebrick Date: Wed, 8 Aug 2018 15:31:29 -0400 Subject: [PATCH] Add 5 second short dumps to watchdog (#1314) --- LICENSE.md | 1 + ...Add-5-second-short-dumps-to-watchdog.patch | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 Spigot-Server-Patches/Add-5-second-short-dumps-to-watchdog.patch diff --git a/LICENSE.md b/LICENSE.md index f585b44f37..728228cf69 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -36,4 +36,5 @@ stonar96 Hugo Manrique Andrew Steinborn willies952002 +MicleBrick ``` diff --git a/Spigot-Server-Patches/Add-5-second-short-dumps-to-watchdog.patch b/Spigot-Server-Patches/Add-5-second-short-dumps-to-watchdog.patch new file mode 100644 index 0000000000..44147244ef --- /dev/null +++ b/Spigot-Server-Patches/Add-5-second-short-dumps-to-watchdog.patch @@ -0,0 +1,85 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: miclebrick +Date: Wed, 8 Aug 2018 15:30:52 -0400 +Subject: [PATCH] Add 5 second short dumps to watchdog + + +diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java +index 57a4748a3..815c3e664 100644 +--- a/src/main/java/org/spigotmc/WatchdogThread.java ++++ b/src/main/java/org/spigotmc/WatchdogThread.java +@@ -0,0 +0,0 @@ public class WatchdogThread extends Thread + + private static WatchdogThread instance; + private final long timeoutTime; ++ private final long shortTimeout; // Paper - Timeout time for just printing a dump but not restarting + private final boolean restart; + private volatile long lastTick; ++ private long lastShortDump; // Paper - Keep track of short dump times to avoid spamming console with short dumps + private volatile boolean stopping; + + private WatchdogThread(long timeoutTime, boolean restart) +@@ -0,0 +0,0 @@ public class WatchdogThread extends Thread + super( "Paper Watchdog Thread" ); + this.timeoutTime = timeoutTime; + this.restart = restart; ++ shortTimeout = Math.min(5000, timeoutTime); // Paper - Make short timeout the lower of 5 seconds, and timeout time + } + + public static void doStart(int timeoutTime, boolean restart) +@@ -0,0 +0,0 @@ public class WatchdogThread extends Thread + while ( !stopping ) + { + // +- if ( lastTick != 0 && System.currentTimeMillis() > lastTick + timeoutTime && !Boolean.getBoolean("disable.watchdog")) // Paper - Add property to disable ++ long currentTime = System.currentTimeMillis(); // Paper - do we REALLY need to call this method multiple times? ++ if ( lastTick != 0 && currentTime > lastTick + shortTimeout && !Boolean.getBoolean("disable.watchdog") ) // Paper - Add property to disable and short timeout + { ++ // Paper start ++ boolean isLongTimeout = currentTime > lastTick + timeoutTime; ++ // Don't spam short dumps ++ if ( !isLongTimeout && currentTime < lastShortDump + shortTimeout ) continue; ++ lastShortDump = currentTime; ++ // Paper end + Logger log = Bukkit.getServer().getLogger(); ++ // Paper start - Different message when it's a short timeout ++ if ( isLongTimeout ) ++ { + log.log( Level.SEVERE, "The server has stopped responding!" ); + log.log( Level.SEVERE, "Please report this to https://github.com/PaperMC/Paper/issues" ); + log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" ); +@@ -0,0 +0,0 @@ public class WatchdogThread extends Thread + } + } + // Paper end ++ } else ++ { ++ log.log( Level.SEVERE, "The server has not responded for " + shortTimeout / 1000 + " seconds! Creating thread dump"); ++ } ++ // Paper end - Different message for short timeout + log.log( Level.SEVERE, "------------------------------" ); + log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); + dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().primaryThread.getId(), Integer.MAX_VALUE ), log ); + log.log( Level.SEVERE, "------------------------------" ); + // ++ // Paper start - Only print full dump on long timeouts ++ if ( isLongTimeout ) ++ { + log.log( Level.SEVERE, "Entire Thread Dump:" ); + ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads( true, true ); + for ( ThreadInfo thread : threads ) +@@ -0,0 +0,0 @@ public class WatchdogThread extends Thread + RestartCommand.restart(); + } + break; ++ } // Paper end + } + + try + { +- sleep( 10000 ); ++ sleep( 1000 ); // Paper - Reduce check time to every second instead of every ten seconds, more consistent and allows for short timeout + } catch ( InterruptedException ex ) + { + interrupt(); +-- \ No newline at end of file