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); + } } diff --git a/SpigotCore_Main/src/de/steamwar/core/ErrorHandler.java b/SpigotCore_Main/src/de/steamwar/core/ErrorHandler.java index 2a5ffa5..c958584 100644 --- a/SpigotCore_Main/src/de/steamwar/core/ErrorHandler.java +++ b/SpigotCore_Main/src/de/steamwar/core/ErrorHandler.java @@ -149,6 +149,7 @@ public class ErrorHandler extends Handler { startsWith.add("Chunk coordinates: "); startsWith.add("Failed to save history"); startsWith.add("\t... "); + startsWith.add("ERROR IN Protocol"); ignoreStartsWith = Collections.unmodifiableList(startsWith); List contains = new ArrayList<>(); diff --git a/SpigotCore_Main/src/de/steamwar/sql/SQLWrapperImpl.java b/SpigotCore_Main/src/de/steamwar/sql/SQLWrapperImpl.java index c6d833d..7428574 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/SQLWrapperImpl.java +++ b/SpigotCore_Main/src/de/steamwar/sql/SQLWrapperImpl.java @@ -52,12 +52,14 @@ public class SQLWrapperImpl implements SQLWrapper { String material = config.getString("Schematic.Material", "STONE_BUTTON"); if(!config.getStringList("CheckQuestions").isEmpty()) { - checktype = new SchematicType("C" + type, "C" + shortcut, SchematicType.Type.CHECK_TYPE, null, material); + checktype = new SchematicType("C" + type, "C" + shortcut, SchematicType.Type.CHECK_TYPE, null, material, true); tmpTypes.add(checktype); tmpFromDB.put(checktype.toDB(), checktype); } - SchematicType current = new SchematicType(type, shortcut, config.isConfigurationSection("Server") ? SchematicType.Type.FIGHT_TYPE : SchematicType.Type.NORMAL, checktype, material); + boolean manualCheck = config.getBoolean("Schematic.ManualCheck", true); + + SchematicType current = new SchematicType(type, shortcut, config.isConfigurationSection("Server") ? SchematicType.Type.FIGHT_TYPE : SchematicType.Type.NORMAL, checktype, material, manualCheck); tmpTypes.add(current); tmpFromDB.put(type.toLowerCase(), current); }