Messerrunde: Einrichten bei Fehlern automatisch wiederholen
Nach einer frischen Installation dauert das erste Laden einer Map oft länger als die Wartezeit. Die App versucht das Einrichten jetzt bis zu dreimal (alle 10 s). Scheitern alle Versuche, zeigt die Lobby den Fehler und dem Organisator den Knopf "Messerrunde neu einrichten".
This commit is contained in:
1 parent
934d989572
commit
1492c280d5
4 files changed
+66
-4
No files matched your search
@@ -18,6 +18,9 @@ export const SERVER_STATUS = {
|
||||
|
||||
const ACTIVE = ['starting', 'ready', 'configuring', 'configured', 'config_failed', 'failed'];
|
||||
const SLOW_POLL_MS = 30_000;
|
||||
// Messerrunde: so oft wird das Einrichten versucht, bevor der Organisator selbst neu starten muss
|
||||
const KNIFE_RETRIES = 3;
|
||||
const KNIFE_RETRY_DELAY_MS = 10_000;
|
||||
|
||||
/**
|
||||
* Steuert den Lebenszyklus der Match-Server. Kennt nur die Adapter-Schnittstelle
|
||||
@@ -29,6 +32,9 @@ export class ServerManager {
|
||||
this.busy = new Set();
|
||||
this.simulator = new DemoMatchSimulator();
|
||||
this.autoAdvance = new Map();
|
||||
// Fehlversuche beim Einrichten der Messerrunde je Match (für die automatische Wiederholung)
|
||||
this.knifeAttempts = new Map();
|
||||
this.knifeRetryDelayMs = KNIFE_RETRY_DELAY_MS;
|
||||
this.lastPoll = new Map();
|
||||
this.timers = [];
|
||||
}
|
||||
@@ -444,10 +450,22 @@ export class ServerManager {
|
||||
try {
|
||||
await this.adapter.configure(JSON.parse(row.handle), buildKnifeCommands({ map, pool, password: row.server_password, endlessWarmup: true }));
|
||||
} catch (err) {
|
||||
this.update(matchId, { knife_at: null, knife_phase: null, message: `Messerrunde konnte nicht eingerichtet werden: ${err.message}` });
|
||||
// Das erste Laden einer Map dauert nach einer frischen Installation oft länger: von selbst noch einmal versuchen
|
||||
const attempt = (this.knifeAttempts.get(matchId) ?? 0) + 1;
|
||||
this.knifeAttempts.set(matchId, attempt);
|
||||
const again = attempt < KNIFE_RETRIES;
|
||||
this.update(matchId, {
|
||||
knife_at: null,
|
||||
knife_phase: null,
|
||||
message: again
|
||||
? `Messerrunde wird erneut eingerichtet (Versuch ${attempt + 1} von ${KNIFE_RETRIES}): ${err.message}`
|
||||
: `Messerrunde konnte nicht eingerichtet werden: ${err.message}`,
|
||||
});
|
||||
this.service.log(matchId, 'server', `Messerrunde nicht eingerichtet: ${err.message}`);
|
||||
if (again) this.timers.push(setTimeout(() => this.maybeConfigure(matchId), this.knifeRetryDelayMs));
|
||||
return;
|
||||
}
|
||||
this.knifeAttempts.delete(matchId);
|
||||
this.update(matchId, { knife_at: Date.now(), knife_phase: 'warmup', message: 'Messerrunde: Aufwärmphase, bis der Organisator startet' });
|
||||
this.service.log(matchId, 'server', 'Server für die Messerrunde bereit (Aufwärmphase)');
|
||||
} finally {
|
||||
@@ -555,6 +573,7 @@ export class ServerManager {
|
||||
return;
|
||||
}
|
||||
if (this.wantsKnife(match, row)) {
|
||||
this.knifeAttempts.delete(matchId);
|
||||
this.service.log(matchId, 'server', 'Organisator richtet die Messerrunde neu ein');
|
||||
this.configureKnife(matchId).catch((err) => this.logger.error(err));
|
||||
return;
|
||||
|
||||
Reference in new issue
Block a user