Docker-Warteschlange: Update-Check per RCON statt nur per Logzeile erkennen
Die Zeile 'Starting CS2 Dedicated Server' rutscht nach dem Serverstart schnell aus den letzten Logzeilen. Der nächste Match-Container wartete dadurch bis zur Zeitgrenze (20 min). Jetzt gilt ein Container als fertig, sobald er per RCON antwortet; die Logzeile bleibt als zweite Erkennung.
This commit is contained in:
1 parent
84dad0993c
commit
e3a1ed4a63
2 files changed
+44
-6
No files matched your search
@@ -62,18 +62,24 @@ export class DockerServerAdapter {
|
||||
release();
|
||||
throw err;
|
||||
}
|
||||
this.waitForUpdateCheck(result.handle.container).finally(release);
|
||||
this.waitForUpdateCheck(result.handle).finally(release);
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Wartet, bis der Container SteamCMD abgeschlossen hat, beendet ist oder die Startzeit abläuft. */
|
||||
async waitForUpdateCheck(container, { pollMs = 3000 } = {}) {
|
||||
/**
|
||||
* Wartet, bis der Container SteamCMD abgeschlossen hat, beendet ist oder die Startzeit abläuft.
|
||||
* Fertig ist er, sobald der Spielserver per RCON antwortet (RCON gibt es erst nach SteamCMD) oder
|
||||
* die Startzeile im Log steht. Nur auf das Log zu schauen reicht nicht: Der Server schreibt danach
|
||||
* so viel, dass die Zeile schnell aus den letzten Zeilen herausfällt.
|
||||
*/
|
||||
async waitForUpdateCheck(handle, { pollMs = 3000 } = {}) {
|
||||
const deadline = Date.now() + this.options.startTimeoutMinutes * 60_000;
|
||||
while (Date.now() < deadline) {
|
||||
try {
|
||||
const state = await this.docker(['inspect', '-f', '{{.State.Status}}', container], 15_000);
|
||||
const state = await this.docker(['inspect', '-f', '{{.State.Status}}', handle.container], 15_000);
|
||||
if (state !== 'running' && state !== 'created') return;
|
||||
const logs = await this.docker(['logs', '--tail', '200', container], 15_000);
|
||||
if (await this.isReachable(handle)) return;
|
||||
const logs = await this.docker(['logs', '--tail', '2000', handle.container], 15_000);
|
||||
if (logs.includes(UPDATE_DONE_MARKER)) return;
|
||||
} catch {
|
||||
return; // Container weg – nicht ewig blockieren
|
||||
@@ -82,6 +88,15 @@ export class DockerServerAdapter {
|
||||
}
|
||||
}
|
||||
|
||||
async isReachable(handle) {
|
||||
try {
|
||||
await rconStatus(this.target(handle));
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async launch({ matchId, mode, secrets }) {
|
||||
const port = this.allocatePort();
|
||||
const tvPort = port + 1;
|
||||
|
||||
Reference in new issue
Block a user