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

+12
View File
@@ -753,7 +753,19 @@ test('Messerrunde auf dem eigenen Match-Server: Verbindungsdaten in der Lobby, d
const capA = snap.teams.A.players.find((p) => p.isCaptain)?.nickname ?? 'a1';
const capB = snap.teams.B.players.find((p) => p.isCaptain)?.nickname ?? 'b1';
await playVeto(call, id, { A: tokens[capA], B: tokens[capB] });
// Das Ende der Messerrunde kommt während des Einrichtens an: darf nicht als Ende von Map 1 zählen
await waitFor(() => app.manager.row(id).status === 'configuring', { label: 'Map 1 wird eingerichtet' });
const firstMap = app.service.seriesMaps(id)[0].map;
const knifeEnd = ['Team "CT" triggered "SFUI_Notice_Target_Saved" (CT "1") (T "0")', 'World triggered "Round_End"',
`Game Over: scrimcomp2v2 ${firstMap} score 1:0 after 2 min`].join('\n');
const key = app.manager.row(id).config_key;
assert.equal((await fetch(`http://127.0.0.1:${app.server.address().port}/api/logs/${id}/${key}`, { method: 'POST', body: knifeEnd })).status, 200);
await waitFor(() => app.manager.row(id).status === 'configured', { label: 'Match eingerichtet' });
const map1 = app.service.seriesMaps(id)[0];
assert.notEqual(map1.status, 'done', 'Messerrunde zählt nicht als Map-Ende');
assert.equal(map1.score_a, 0);
assert.equal(app.service.getMatch(id).current_map_number, 1);
assert.deepEqual(plans.at(-1).beforeMapChange.slice(0, 2), ['mp_warmup_pausetimer 1', 'mp_warmup_start'], 'laufende Messerrunde wird zuerst angehalten');
const row = app.manager.row(id);
assert.equal(row.handle, handle, 'derselbe Server');
assert.equal(row.knife_at, null);
+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);
});