Fix: Starts meiden hochfahrende Hosts, Messerrunde zählt nicht als Map-Ende

- Neue Server meiden Hosts, auf denen gerade ein Container per SteamCMD lädt
  (Warteschlange im Prozess und laufende Starts laut Datenbank). Vorher warteten
  alle Starts hinter einem langen Download, obwohl andere Hosts frei waren.
- Vor dem Einrichten des Matches wird eine laufende Messerrunde in die
  Aufwärmphase gesetzt, und Logzeilen zählen erst, wenn die Map eingerichtet ist.
  Vorher wurde das Ende der Messerrunde als Ende von Map 1 gewertet und die
  nächste Map automatisch geladen.
This commit is contained in:
mregosar committed 2026-11-01 18:50:12 +01:00
1 parent 148cd99856
commit d36dcacd39
6 files changed
+83 -8

No files matched your search

+26
View File
@@ -107,3 +107,29 @@ test('Alter Handle ohne passenden Host-Namen wird über die Adresse dem richtige
assert.equal(p.adapterFor({ hostName: 'default', rconHost: '10.0.0.2' }).options.name, 'b');
assert.throws(() => p.adapterFor({ hostName: 'weg', rconHost: '10.9.9.9' }), /nicht \(mehr\) konfiguriert/);
});
test('Neue Server meiden Hosts, auf denen gerade ein Server hochfährt (SteamCMD)', async () => {
const starting = { '10.0.0.2': 1 };
const p = new DockerHostPool(options([hostA, hostB]), {
getUsedPorts: () => new Set(),
getStarting: (publicHost, exclude) => (exclude === 'self' ? 0 : starting[publicHost] ?? 0),
runDocker: fakeDocker().run,
});
// b hat mehr Plätze, aber dort lädt gerade ein Container: a gewinnt
assert.equal(p.pickHost().name, 'a');
// Der hochfahrende Server selbst zählt nicht gegen seinen eigenen Neustart
assert.equal(p.pickHost('self').name, 'b');
// Warteschlange im Prozess zählt genauso
starting['10.0.0.2'] = 0;
p.adapters.get('b').pendingStarts = 1;
assert.equal(p.pickHost().name, 'a');
// Starts zählen hoch und nach dem Update-Check wieder herunter
const a = p.adapters.get('a');
let done;
a.waitForUpdateCheck = () => new Promise((r) => { done = r; });
await a.start({ matchId: 'm1', mode: 'competitive', secrets });
assert.equal(a.pendingStarts, 1);
done();
await new Promise((r) => setImmediate(r));
assert.equal(a.pendingStarts, 0);
});