Server 2.10.5: far fewer save freezes

Saving makes the game of the asked player freeze for seconds. Joining now asks
for a fresh save only if the stored one is older than JoinSaveMaxAgeMinutes (15)
and something changed - otherwise the stored save plus the world state; regular
saves every 30 minutes (old untouched default 10 is migrated once) and marked
not urgent, so the game can wait for a calm moment (60 s deadline). 3 new tests (168).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 00:08:56 +02:00
co-authored by Claude Opus 5.5
parent 4cc71aa079
commit 6e2ef3b570
5 changed files with 63 additions and 13 deletions
+19 -3
View File
@@ -28,9 +28,18 @@ public sealed class ServerConfig
public int AutosaveSeconds { get; set; } = 60;
/// <summary>
/// So oft (Minuten) lässt sich der Server von einem Spieler im Spiel den aktuellen Spielstand hochladen
/// (Schrauben, Teile, alles wie im Spiel gespeichert). Zusätzlich immer, wenn jemand beitritt. 0 = nur beim Beitreten.
/// (Schrauben, Teile, alles wie im Spiel gespeichert). Speichern lässt das Spiel dieses Spielers einige Sekunden
/// hängen - deshalb nicht zu oft. 0 = nur beim Beitreten.
/// </summary>
public int SaveSyncMinutes { get; set; } = 10;
public int SaveSyncMinutes { get; set; } = 30;
/// <summary>
/// Beim Beitreten nur dann frisch speichern lassen, wenn der letzte Spielstand älter ist (Minuten) - sonst bekommt der
/// Neue den gespeicherten Stand und die seitdem passierten Änderungen. 0 = bei jedem Beitritt frisch speichern.
/// </summary>
public int JoinSaveMaxAgeMinutes { get; set; } = 15;
/// <summary>Version der Einstellungen (für einmalige Anpassungen alter server.json).</summary>
public int ConfigVersion { get; set; } = 0;
public const int CurrentConfigVersion = 2;
/// <summary>Optional: Steam Web API Key, um Steam-Tickets der Spieler bei Steam zu prüfen.</summary>
public string SteamWebApiKey { get; set; } = "";
/// <summary>Gesperrte SteamID64s.</summary>
@@ -72,11 +81,18 @@ public sealed class ServerConfig
created = !File.Exists(path);
if (created)
{
var fresh = new ServerConfig();
var fresh = new ServerConfig { ConfigVersion = CurrentConfigVersion };
fresh.Save(path);
return fresh;
}
var config = JsonSerializer.Deserialize<ServerConfig>(File.ReadAllText(path), Options) ?? new ServerConfig();
if (config.ConfigVersion < 2)
{
// Früherer Standard: alle 10 Minuten speichern lassen - das ließ einen Spieler alle 10 Minuten einige Sekunden
// hängen. Wer den Standard nie geändert hat, bekommt den neuen (30).
if (config.SaveSyncMinutes == 10) config.SaveSyncMinutes = 30;
config.ConfigVersion = CurrentConfigVersion;
}
// Neue Einstellungen (z.B. Admins) auch in ältere server.json schreiben, damit man sie sieht
try { config.Save(path); } catch (Exception) { } // z.B. schreibgeschützt - dann eben nicht
return config;