aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Wilkins <samwilkins333@gmail.com>2019-12-14 03:05:07 -0500
committerSam Wilkins <samwilkins333@gmail.com>2019-12-14 03:05:07 -0500
commita1beec1e1ed18ffefc518876fb783b7a14282960 (patch)
treee51feb27d6b4b9574202bc7f139c4546de53f910 /src
parent0aa596a4c2bbdd495f1cacdc0611098f52b6bf8a (diff)
repaired state logic
Diffstat (limited to 'src')
-rw-r--r--src/server/session_manager/config.ts11
-rw-r--r--src/server/session_manager/logs/current_server_pid.log2
-rw-r--r--src/server/session_manager/logs/current_session_manager_pid.log2
-rw-r--r--src/server/session_manager/session_manager.ts72
4 files changed, 46 insertions, 41 deletions
diff --git a/src/server/session_manager/config.ts b/src/server/session_manager/config.ts
index 47d3375e0..a373b986e 100644
--- a/src/server/session_manager/config.ts
+++ b/src/server/session_manager/config.ts
@@ -24,9 +24,10 @@ export const crashPath = resolve(logPath, "./crashes");
* State
*/
export enum SessionState {
- INITIALIZING,
- LISTENING,
- AUTOMATIC_RESTART,
- MANUAL_RESTART,
- EXITING
+ STARTING = "STARTING",
+ INITIALIZED = "INITIALIZED",
+ LISTENING = "LISTENING",
+ CRASH_RESTARTING = "CRASH_RESTARTING",
+ MANUALLY_RESTARTING = "MANUALLY_RESTARTING",
+ EXITING = "EXITING"
} \ No newline at end of file
diff --git a/src/server/session_manager/logs/current_server_pid.log b/src/server/session_manager/logs/current_server_pid.log
index 6a2f267b3..85fdb7ae0 100644
--- a/src/server/session_manager/logs/current_server_pid.log
+++ b/src/server/session_manager/logs/current_server_pid.log
@@ -1 +1 @@
-50888 created @ 2019-12-14T06:59:59.767Z
+54649 created @ 2019-12-14T08:04:42.391Z
diff --git a/src/server/session_manager/logs/current_session_manager_pid.log b/src/server/session_manager/logs/current_session_manager_pid.log
index ab19403b4..75c23b35a 100644
--- a/src/server/session_manager/logs/current_session_manager_pid.log
+++ b/src/server/session_manager/logs/current_session_manager_pid.log
@@ -1 +1 @@
-50846
+54643
diff --git a/src/server/session_manager/session_manager.ts b/src/server/session_manager/session_manager.ts
index 6e9b03c79..51aba26a0 100644
--- a/src/server/session_manager/session_manager.ts
+++ b/src/server/session_manager/session_manager.ts
@@ -7,27 +7,32 @@ import { writeFileSync, existsSync, mkdirSync } from "fs";
import { resolve } from 'path';
import { ChildProcess, exec, execSync } from "child_process";
import InputManager from "./input_manager";
-import { identifier, logPath, crashPath, onWindows, pid, ports, heartbeat, recipient, LOCATION, latency } from "./config";
+import { identifier, logPath, crashPath, onWindows, pid, ports, heartbeat, recipient, LOCATION, latency, SessionState } from "./config";
const killport = require("kill-port");
process.on('SIGINT', endPrevious);
+let state: SessionState = SessionState.STARTING;
+const is = (...reference: SessionState[]) => reference.includes(state);
+const set = (reference: SessionState) => state = reference;
const { registerCommand } = new InputManager({ identifier });
-let manualRestartActive = false;
registerCommand("restart", [], async () => {
- manualRestartActive = true;
+ set(SessionState.MANUALLY_RESTARTING);
identifiedLog(cyan("Initializing manual restart..."));
await endPrevious();
});
registerCommand("exit", [], async () => {
+ set(SessionState.EXITING);
identifiedLog(cyan("Initializing session end"));
await endPrevious();
identifiedLog("Cleanup complete. Exiting session...\n");
execSync(killAllCommand());
});
+registerCommand("state", [], () => identifiedLog(state));
+
if (!existsSync(logPath)) {
mkdirSync(logPath);
}
@@ -51,9 +56,6 @@ if (!["win32", "darwin"].includes(process.platform)) {
process.exit(1);
}
-let restarting = false;
-let count = 0;
-
function startServerCommand() {
if (onWindows) {
return '"C:\\Program Files\\Git\\git-bash.exe" -c "npm run start-release"';
@@ -95,42 +97,44 @@ async function endPrevious() {
let current_backup: ChildProcess | undefined = undefined;
async function checkHeartbeat() {
+ const listening = is(SessionState.LISTENING);
let error: any;
try {
- count && !restarting && process.stdout.write(`${identifier} 👂 `);
+ listening && process.stdout.write(`${identifier} 👂 `);
await request.get(heartbeat);
- count && !restarting && console.log('⇠ 💚');
- if (restarting || manualRestartActive) {
- addLogEntry(count++ ? "Backup server successfully restarted" : "Server successfully started", green);
- restarting = false;
+ listening && console.log('⇠ 💚');
+ if (!listening) {
+ addLogEntry(is(SessionState.INITIALIZED) ? "Server successfully started" : "Backup server successfully restarted", green);
+ set(SessionState.LISTENING);
}
} catch (e) {
- count && !restarting && console.log("⇠ 💔");
+ listening && console.log("⇠ 💔");
error = e;
} finally {
- if (error) {
- if (!restarting || manualRestartActive) {
- restarting = true;
- if (count && !manualRestartActive) {
- console.log();
- addLogEntry("Detected a server crash", red);
- identifiedLog(red(error.message));
- await endPrevious();
- await log_execution({
- startMessage: identifier + " Sending crash notification email",
- endMessage: ({ error, result }) => {
- const success = error === null && result === true;
- return identifier + ` ${(success ? `Notification successfully sent to` : `Failed to notify`)} ${recipient} ${timestamp()}`;
- },
- action: async () => notify(error || "Hmm, no error to report..."),
- color: cyan
- });
- identifiedLog(green("Initiating server restart..."));
- }
- manualRestartActive = false;
- current_backup = exec(startServerCommand(), err => identifiedLog(err?.message || count ? "Previous server process exited." : "Spawned initial server."));
- writeLocalPidLog("server", `${(current_backup?.pid ?? -2) + 1} created ${timestamp()}`);
+ if (error && !is(SessionState.CRASH_RESTARTING, SessionState.INITIALIZED)) {
+ if (is(SessionState.STARTING)) {
+ set(SessionState.INITIALIZED);
+ } else if (is(SessionState.MANUALLY_RESTARTING)) {
+ set(SessionState.CRASH_RESTARTING);
+ } else {
+ set(SessionState.CRASH_RESTARTING);
+ console.log();
+ addLogEntry("Detected a server crash", red);
+ identifiedLog(red(error.message));
+ await endPrevious();
+ await log_execution({
+ startMessage: identifier + " Sending crash notification email",
+ endMessage: ({ error, result }) => {
+ const success = error === null && result === true;
+ return identifier + ` ${(success ? `Notification successfully sent to` : `Failed to notify`)} ${recipient} ${timestamp()}`;
+ },
+ action: async () => notify(error || "Hmm, no error to report..."),
+ color: cyan
+ });
+ identifiedLog(green("Initiating server restart..."));
}
+ current_backup = exec(startServerCommand(), err => identifiedLog(err?.message || is(SessionState.INITIALIZED) ? "Spawned initial server." : "Previous server process exited."));
+ writeLocalPidLog("server", `${(current_backup?.pid ?? -2) + 1} created ${timestamp()}`);
}
setTimeout(checkHeartbeat, 1000 * latency);
}