From 0fa31ab91458998fbb1d96909f0e124e54be7521 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 28 Nov 2023 10:39:57 +0100 Subject: [PATCH] Implement hard shutdown after 80s --- .../src/de/steamwar/core/CrashDetector.java | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/core/CrashDetector.java b/SpigotCore_Main/src/de/steamwar/core/CrashDetector.java index a0bb826..26a12f0 100644 --- a/SpigotCore_Main/src/de/steamwar/core/CrashDetector.java +++ b/SpigotCore_Main/src/de/steamwar/core/CrashDetector.java @@ -31,13 +31,17 @@ public class CrashDetector { private static final long TIMEOUT = 20000; private final AtomicLong lastTick = new AtomicLong(Long.MAX_VALUE); + private final AtomicLong lastMessage = new AtomicLong(Long.MAX_VALUE); private final Thread mainThread = Thread.currentThread(); private final Thread watchdog; private boolean run = true; public CrashDetector () { - Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> lastTick.set(System.currentTimeMillis()), 0, 1); + Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> { + lastTick.set(System.currentTimeMillis()); + lastMessage.set(System.currentTimeMillis()); + }, 0, 1); watchdog = new Thread(this::run, "SteamWar Watchdog"); watchdog.setDaemon(true); watchdog.start(); @@ -56,19 +60,17 @@ public class CrashDetector { SWException.init(); while (run) { long curTime = System.currentTimeMillis(); - if(curTime - TIMEOUT > lastTick.get()) { + if(curTime - 4*TIMEOUT >= lastTick.get()) { + SWException.log("Server did not recover in " + (curTime - lastTick.get()) + "ms, unclean server stop", ""); + hardStop(); + } else if(curTime - TIMEOUT > lastMessage.get()) { if(mainThread.isAlive()) { SWException.log("Server hung for " + (curTime - lastTick.get()) + "ms", Arrays.stream(mainThread.getStackTrace()).map(StackTraceElement::toString).collect(Collectors.joining("\n"))); } else { SWException.log("Server thread already dead, unclean server stop", "Core enabled: " + Core.getInstance().isEnabled()); - if(Core.getInstance().isEnabled()) { - Core.getInstance().onDisable(); - } - Statement.closeAll(); - //System.exit(0); Does freeze, potential freezing issues: ConsoleRestoreHook, ApplicationShutdownHooks or DeleteOnExitHook - Runtime.getRuntime().halt(0); + hardStop(); } - lastTick.set(curTime); + lastMessage.set(curTime); } try { Thread.sleep(1000); @@ -77,4 +79,13 @@ public class CrashDetector { } } } + + private void hardStop() { + if(Core.getInstance().isEnabled()) { + Core.getInstance().onDisable(); + } + Statement.closeAll(); + //System.exit(0); Does freeze, potential freezing issues: ConsoleRestoreHook, ApplicationShutdownHooks or DeleteOnExitHook + Runtime.getRuntime().halt(0); + } }