Linux-Wackeltests: Instanz endet erst auf die Stopp-Bitte, Lesetest schreibt bis genug gelesen ist (#722)

Drei Manager-Tests liessen den Prozess vor der Stopp-Bitte enden; unter Last
sah der Aufsichtstakt das zuerst und meldete Crashed statt Stopped. Die
FakeChannel bekommt OnStopRequest, die Tests beenden darin. Der Drain-Test
bekommt 20 s statt 2 s Luft. AtomicFile schreibt, bis der Leser 20 Blicke
hatte, statt fest 40 Mal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-02 11:50:51 +02:00
co-authored by Claude Opus 5.5
parent e42ec100b0
commit 753d633cf3
5 changed files with 29 additions and 16 deletions
@@ -119,6 +119,9 @@ public sealed class AtomicFileTests : IDisposable
AtomicFile.WriteAllText(path, klein);
var fehler = 0;
var gelesen = 0;
// Harte Zeitgrenze, damit ein Fehler im Schreiber den Test nicht hängen lässt.
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20));
@@ -126,7 +129,9 @@ public sealed class AtomicFileTests : IDisposable
{
try
{
for (var i = 0; i < 40; i++)
// #722: Geschrieben wird, bis der Leser genug gesehen hat — nicht eine feste
// Zahl von Malen. Unter Parallellast kam der Leser sonst nur auf fuenf Blicke.
for (var i = 0; (i < 40 || Volatile.Read(ref gelesen) < 20) && !cts.IsCancellationRequested; i++)
{
AtomicFile.WriteAllText(path, i % 2 == 0 ? gross : klein);
await Task.Delay(1);
@@ -138,9 +143,6 @@ public sealed class AtomicFileTests : IDisposable
}
});
var fehler = 0;
var gelesen = 0;
var leser = Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
@@ -150,7 +152,7 @@ public sealed class AtomicFileTests : IDisposable
// AtomicFile.ReadAllText, damit der Leser den Schreiber nicht
// blockiert — genau dafür gibt es den Helfer.
var inhalt = AtomicFile.ReadAllText(path);
gelesen++;
Interlocked.Increment(ref gelesen);
// Muss immer ein vollständiges JSON-Array sein.
JsonSerializer.Deserialize<string[]>(inhalt);