Reintroduce watchdog
This commit is contained in:
@@ -10,6 +10,9 @@ import core.net.IoEventHandler
|
|||||||
import core.net.IoSession
|
import core.net.IoSession
|
||||||
import core.net.ServerSocketConnection
|
import core.net.ServerSocketConnection
|
||||||
import core.plugin.CorePluginTypes.StartupPlugin
|
import core.plugin.CorePluginTypes.StartupPlugin
|
||||||
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import rs09.game.node.entity.state.newsys.StateRepository
|
import rs09.game.node.entity.state.newsys.StateRepository
|
||||||
import rs09.game.system.SystemLogger
|
import rs09.game.system.SystemLogger
|
||||||
import rs09.game.system.config.ConfigParser
|
import rs09.game.system.config.ConfigParser
|
||||||
@@ -22,7 +25,10 @@ import rs09.game.world.repository.Repository.players
|
|||||||
import rs09.net.ms.ManagementServer
|
import rs09.net.ms.ManagementServer
|
||||||
import rs09.plugin.PluginManager
|
import rs09.plugin.PluginManager
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.FileWriter
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.lang.management.ManagementFactory
|
||||||
|
import java.lang.management.ThreadMXBean
|
||||||
import java.net.InetSocketAddress
|
import java.net.InetSocketAddress
|
||||||
import java.nio.channels.SelectionKey
|
import java.nio.channels.SelectionKey
|
||||||
import java.nio.channels.Selector
|
import java.nio.channels.Selector
|
||||||
@@ -42,6 +48,7 @@ object Server {
|
|||||||
private var service: ExecutorService? = null
|
private var service: ExecutorService? = null
|
||||||
private var channel: ServerSocketConnection? = null
|
private var channel: ServerSocketConnection? = null
|
||||||
private var eventHandler: IoEventHandler? = null
|
private var eventHandler: IoEventHandler? = null
|
||||||
|
var lastHeartbeat = System.currentTimeMillis()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The current server state.
|
* The current server state.
|
||||||
@@ -69,6 +76,25 @@ object Server {
|
|||||||
ServerConfigParser.parse("worldprops" + File.separator + "default.conf")
|
ServerConfigParser.parse("worldprops" + File.separator + "default.conf")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GlobalScope.launch {
|
||||||
|
delay(20000)
|
||||||
|
lastHeartbeat = System.currentTimeMillis()
|
||||||
|
while(true){
|
||||||
|
if(System.currentTimeMillis() - lastHeartbeat > 7200 && state == ServerState.RUNNING){
|
||||||
|
SystemLogger.logErr("Triggering reboot due to heartbeat timeout")
|
||||||
|
SystemLogger.logErr("Creating thread dump...")
|
||||||
|
val dump = threadDump(true, true)
|
||||||
|
FileWriter("latestdump.txt").use {
|
||||||
|
it.write(dump)
|
||||||
|
it.flush()
|
||||||
|
it.close()
|
||||||
|
}
|
||||||
|
exitProcess(0)
|
||||||
|
}
|
||||||
|
delay(625)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (state != ServerState.CLOSED) {
|
while (state != ServerState.CLOSED) {
|
||||||
when (state) {
|
when (state) {
|
||||||
|
|
||||||
@@ -172,4 +198,14 @@ object Server {
|
|||||||
Runtime.getRuntime().removeShutdownHook(ServerConstants.SHUTDOWN_HOOK)
|
Runtime.getRuntime().removeShutdownHook(ServerConstants.SHUTDOWN_HOOK)
|
||||||
exitProcess(0)
|
exitProcess(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun threadDump(lockedMonitors: Boolean, lockedSynchronizers: Boolean): String? {
|
||||||
|
val threadDump = StringBuffer(System.lineSeparator())
|
||||||
|
val threadMXBean: ThreadMXBean = ManagementFactory.getThreadMXBean()
|
||||||
|
for (threadInfo in threadMXBean.dumpAllThreads(lockedMonitors, lockedSynchronizers)) {
|
||||||
|
threadDump.append(threadInfo.toString())
|
||||||
|
}
|
||||||
|
return threadDump.toString()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class WorldClock {
|
|||||||
val end = System.currentTimeMillis()
|
val end = System.currentTimeMillis()
|
||||||
//ServerMonitor.eventQueue.add(GuiEvent.UpdateTickTime(end - start))
|
//ServerMonitor.eventQueue.add(GuiEvent.UpdateTickTime(end - start))
|
||||||
//ServerMonitor.eventQueue.add(GuiEvent.UpdatePulseCount(World.Pulser.TASKS.size))
|
//ServerMonitor.eventQueue.add(GuiEvent.UpdatePulseCount(World.Pulser.TASKS.size))
|
||||||
|
Server.lastHeartbeat = System.currentTimeMillis()
|
||||||
Thread.sleep(max(600 - (end - start), 0))
|
Thread.sleep(max(600 - (end - start), 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user