Add Early Warning Feature to WatchDog

Detect when the server has been hung for a long duration, and start printing
thread dumps at an interval until the point of crash.

This will help diagnose what was going on in that time before the crash.
This commit is contained in:
miclebrick
2018-08-08 15:30:52 -04:00
parent 2f4d83a219
commit 31fc02af68
5 changed files with 77 additions and 42 deletions

View File

@@ -142,7 +142,7 @@
thread.setDaemon(true);
thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(DedicatedServer.LOGGER));
thread.start();
@@ -126,13 +203,26 @@
@@ -126,13 +203,27 @@
this.setPreventProxyConnections(dedicatedserverproperties.preventProxyConnections);
this.setLocalIp(dedicatedserverproperties.serverIp);
}
@@ -156,6 +156,7 @@
+ this.paperConfigurations.initializeGlobalConfiguration(this.registryAccess());
+ this.paperConfigurations.initializeWorldDefaultsConfiguration(this.registryAccess());
+ // Paper end - initialize global and world-defaults configuration
+ org.spigotmc.WatchdogThread.doStart(org.spigotmc.SpigotConfig.timeoutTime, org.spigotmc.SpigotConfig.restartOnCrash); // Paper - start watchdog thread
+ io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command
+ com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics
+ com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now
@@ -170,7 +171,7 @@
DedicatedServer.LOGGER.info("Default game type: {}", dedicatedserverproperties.gamemode);
InetAddress inetaddress = null;
@@ -156,21 +246,34 @@
@@ -156,21 +247,34 @@
return false;
}
@@ -208,7 +209,7 @@
this.debugSampleSubscriptionTracker = new DebugSampleSubscriptionTracker(this.getPlayerList());
this.tickTimeLogger = new RemoteSampleLogger(TpsDebugDimensions.values().length, this.debugSampleSubscriptionTracker, RemoteDebugSampleType.TICK_TIME);
long i = Util.getNanos();
@@ -178,13 +281,13 @@
@@ -178,13 +282,13 @@
SkullBlockEntity.setup(this.services, this);
GameProfileCache.setUsesAuthentication(this.usesAuthentication());
DedicatedServer.LOGGER.info("Preparing level \"{}\"", this.getLevelIdName());
@@ -224,7 +225,7 @@
}
if (dedicatedserverproperties.enableQuery) {
@@ -197,7 +300,7 @@
@@ -197,7 +301,7 @@
this.rconThread = RconThread.create(this);
}
@@ -233,7 +234,7 @@
Thread thread1 = new Thread(new ServerWatchdog(this));
thread1.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandlerWithName(DedicatedServer.LOGGER));
@@ -213,7 +316,13 @@
@@ -213,7 +317,13 @@
return true;
}
@@ -247,7 +248,7 @@
@Override
public boolean isSpawningMonsters() {
@@ -293,6 +402,7 @@
@@ -293,6 +403,7 @@
this.queryThreadGs4.stop();
}
@@ -255,7 +256,7 @@
}
@Override
@@ -302,8 +412,8 @@
@@ -302,8 +413,8 @@
}
@Override
@@ -266,7 +267,7 @@
}
public void handleConsoleInput(String command, CommandSourceStack commandSource) {
@@ -314,7 +424,15 @@
@@ -314,7 +425,15 @@
while (!this.consoleInput.isEmpty()) {
ConsoleInput servercommand = (ConsoleInput) this.consoleInput.remove(0);
@@ -283,7 +284,7 @@
}
}
@@ -383,7 +501,7 @@
@@ -383,7 +502,7 @@
@Override
public boolean isUnderSpawnProtection(ServerLevel world, BlockPos pos, Player player) {
@@ -292,7 +293,7 @@
return false;
} else if (this.getPlayerList().getOps().isEmpty()) {
return false;
@@ -453,7 +571,11 @@
@@ -453,7 +572,11 @@
public boolean enforceSecureProfile() {
DedicatedServerProperties dedicatedserverproperties = this.getProperties();
@@ -305,7 +306,7 @@
}
@Override
@@ -541,16 +663,52 @@
@@ -541,16 +664,52 @@
@Override
public String getPluginNames() {
@@ -362,7 +363,7 @@
}
public void storeUsingWhiteList(boolean useWhitelist) {
@@ -660,4 +818,15 @@
@@ -660,4 +819,15 @@
}
}
}