You've already forked AstralRinth
forked from didirus/AstralRinth
Fixes MOD-163 (#2952)
* init: correctly type powerstate in crash state Signed-off-by: Evan Song <theevansong@gmail.com> * feat: handle oom_killed and exit_code when a server crashes Signed-off-by: Evan Song <theevansong@gmail.com> --------- Signed-off-by: Evan Song <theevansong@gmail.com>
This commit is contained in:
@@ -239,6 +239,7 @@
|
|||||||
:is-server-running="isServerRunning"
|
:is-server-running="isServerRunning"
|
||||||
:stats="stats"
|
:stats="stats"
|
||||||
:server-power-state="serverPowerState"
|
:server-power-state="serverPowerState"
|
||||||
|
:power-state-details="powerStateDetails"
|
||||||
:console-output="throttledConsoleOutput"
|
:console-output="throttledConsoleOutput"
|
||||||
:socket="socket"
|
:socket="socket"
|
||||||
:server="server"
|
:server="server"
|
||||||
@@ -312,6 +313,8 @@ const ramData = ref<number[]>([]);
|
|||||||
const isActioning = ref(false);
|
const isActioning = ref(false);
|
||||||
const isServerRunning = computed(() => serverPowerState.value === "running");
|
const isServerRunning = computed(() => serverPowerState.value === "running");
|
||||||
const serverPowerState = ref<ServerState>("stopped");
|
const serverPowerState = ref<ServerState>("stopped");
|
||||||
|
const powerStateDetails = ref<{ oom_killed?: boolean; exit_code?: number }>();
|
||||||
|
|
||||||
const uptimeSeconds = ref(0);
|
const uptimeSeconds = ref(0);
|
||||||
const firstConnect = ref(true);
|
const firstConnect = ref(true);
|
||||||
const copied = ref(false);
|
const copied = ref(false);
|
||||||
@@ -488,7 +491,14 @@ const handleWebSocketMessage = (data: WSEvent) => {
|
|||||||
reauthenticate();
|
reauthenticate();
|
||||||
break;
|
break;
|
||||||
case "power-state":
|
case "power-state":
|
||||||
updatePowerState(data.state);
|
if (data.state === "crashed") {
|
||||||
|
updatePowerState(data.state, {
|
||||||
|
oom_killed: data.oom_killed,
|
||||||
|
exit_code: data.exit_code,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
updatePowerState(data.state);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "installation-result":
|
case "installation-result":
|
||||||
handleInstallationResult(data);
|
handleInstallationResult(data);
|
||||||
@@ -606,9 +616,19 @@ const updateStats = (currentStats: Stats["current"]) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const updatePowerState = (state: ServerState) => {
|
const updatePowerState = (
|
||||||
console.log("Power state:", state);
|
state: ServerState,
|
||||||
|
details?: { oom_killed?: boolean; exit_code?: number },
|
||||||
|
) => {
|
||||||
|
console.log("Power state:", state, details);
|
||||||
serverPowerState.value = state;
|
serverPowerState.value = state;
|
||||||
|
|
||||||
|
if (state === "crashed") {
|
||||||
|
powerStateDetails.value = details;
|
||||||
|
} else {
|
||||||
|
powerStateDetails.value = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
if (state === "stopped" || state === "crashed") {
|
if (state === "stopped" || state === "crashed") {
|
||||||
stopUptimeUpdates();
|
stopUptimeUpdates();
|
||||||
uptimeSeconds.value = 0;
|
uptimeSeconds.value = 0;
|
||||||
|
|||||||
@@ -35,6 +35,31 @@
|
|||||||
</li>
|
</li>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="props.serverPowerState === 'crashed'" class="flex flex-row gap-4">
|
||||||
|
<IssuesIcon class="hidden h-8 w-8 text-red sm:block" />
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<div class="font-semibold">{{ serverData?.name }} shut down unexpectedly.</div>
|
||||||
|
<div class="font-normal">
|
||||||
|
<template v-if="props.powerStateDetails?.oom_killed">
|
||||||
|
The server stopped because it ran out of memory. There may be a memory leak caused
|
||||||
|
by a mod or plugin, or you may need to upgrade your Modrinth Server.
|
||||||
|
</template>
|
||||||
|
<template v-else-if="props.powerStateDetails?.exit_code !== undefined">
|
||||||
|
We could not automatically determine the specific cause of the crash, but your
|
||||||
|
server exited with code
|
||||||
|
{{ props.powerStateDetails.exit_code }}.
|
||||||
|
{{
|
||||||
|
props.powerStateDetails.exit_code === 1
|
||||||
|
? "There may be a mod or plugin causing the issue, or an issue with your server configuration."
|
||||||
|
: ""
|
||||||
|
}}
|
||||||
|
</template>
|
||||||
|
<template v-else> We could not determine the specific cause of the crash. </template>
|
||||||
|
<div class="mt-2">You can try restarting the server.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div v-else class="flex flex-row gap-4">
|
<div v-else class="flex flex-row gap-4">
|
||||||
<IssuesIcon class="hidden h-8 w-8 text-red sm:block" />
|
<IssuesIcon class="hidden h-8 w-8 text-red sm:block" />
|
||||||
|
|
||||||
@@ -169,6 +194,10 @@ type ServerProps = {
|
|||||||
stats: Stats;
|
stats: Stats;
|
||||||
consoleOutput: string[];
|
consoleOutput: string[];
|
||||||
serverPowerState: ServerState;
|
serverPowerState: ServerState;
|
||||||
|
powerStateDetails?: {
|
||||||
|
oom_killed?: boolean;
|
||||||
|
exit_code?: number;
|
||||||
|
};
|
||||||
isServerRunning: boolean;
|
isServerRunning: boolean;
|
||||||
server: Server<["general", "mods", "backups", "network", "startup", "ws", "fs"]>;
|
server: Server<["general", "mods", "backups", "network", "startup", "ws", "fs"]>;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -167,6 +167,9 @@ export interface WSAuthExpiringEvent {
|
|||||||
export interface WSPowerStateEvent {
|
export interface WSPowerStateEvent {
|
||||||
event: "power-state";
|
event: "power-state";
|
||||||
state: ServerState;
|
state: ServerState;
|
||||||
|
// if state "crashed"
|
||||||
|
oom_killed?: boolean;
|
||||||
|
exit_code?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface WSAuthIncorrectEvent {
|
export interface WSAuthIncorrectEvent {
|
||||||
|
|||||||
Reference in New Issue
Block a user