test: observe landblock worker joins

This commit is contained in:
Erik 2026-08-18 13:03:30 +02:00
parent fa4bdfe89f
commit ad7ebe9425
3 changed files with 107 additions and 17 deletions

View file

@ -342,7 +342,7 @@ public class LandblockStreamerTests
}
[Fact]
public async Task DisposeAndConcurrentDisposeWaitForInFlightLoad()
public void DisposeAndConcurrentDisposeWaitForInFlightLoad()
{
using var entered = new ManualResetEventSlim();
using var release = new ManualResetEventSlim();
@ -359,14 +359,55 @@ public class LandblockStreamerTests
streamer.EnqueueLoad(0x12340000u);
Assert.True(entered.Wait(TimeSpan.FromSeconds(2)));
Task firstDispose = Task.Run(streamer.Dispose);
Task secondDispose = Task.Run(streamer.Dispose);
await Task.Delay(50);
Assert.False(firstDispose.IsCompleted);
Assert.False(secondDispose.IsCompleted);
Exception? firstError = null;
var firstDisposeThread = new Thread(() =>
{
try
{
streamer.Dispose();
}
catch (Exception error)
{
firstError = error;
}
})
{
IsBackground = true,
Name = "LandblockStreamer primary dispose contract",
};
firstDisposeThread.Start();
Assert.True(SpinWait.SpinUntil(
() => (firstDisposeThread.ThreadState & ThreadState.WaitSleepJoin) != 0,
TimeSpan.FromSeconds(2)),
"the primary dispose never waited for the in-flight load");
Exception? secondError = null;
var secondDisposeThread = new Thread(() =>
{
try
{
streamer.Dispose();
}
catch (Exception error)
{
secondError = error;
}
})
{
IsBackground = true,
Name = "LandblockStreamer concurrent dispose contract",
};
secondDisposeThread.Start();
Assert.True(SpinWait.SpinUntil(
() => (secondDisposeThread.ThreadState & ThreadState.WaitSleepJoin) != 0,
TimeSpan.FromSeconds(2)),
"the concurrent dispose never waited for primary disposal");
release.Set();
await Task.WhenAll(firstDispose, secondDispose).WaitAsync(TimeSpan.FromSeconds(2));
Assert.True(firstDisposeThread.Join(TimeSpan.FromSeconds(2)));
Assert.True(secondDisposeThread.Join(TimeSpan.FromSeconds(2)));
Assert.Null(firstError);
Assert.Null(secondError);
}
finally
{