feat: ChunkStreamer tracks failed chunks to prevent retry storms

This commit is contained in:
2026-06-01 12:04:50 +02:00
parent da051ed413
commit 85a345d6e7
2 changed files with 38 additions and 0 deletions

View File

@@ -317,4 +317,38 @@ public class ChunkStreamerTests
// Only the chunk in the load box was created; no spurious remesh.
Assert.Single(created);
}
[Fact]
public void Tick_GeneratorThrows_LogsAndDoesNotRetry()
{
var cfg = new Configuration
{
RenderDistanceHorizontal = 0,
RenderDistanceVertical = 0,
MaxGenerateJobsInFlight = 100,
MaxMeshUploadsPerFrame = 100,
};
var registry = new BlockRegistry();
var store = new InMemoryChunkModificationStore();
var world = new World.World(registry, store);
var mesher = new FakeMesher();
var executor = new SynchronousJobExecutor();
int generateCalls = 0;
Func<Vector3i, VoxelChunk> generate = _ =>
{
generateCalls++;
throw new InvalidOperationException("boom");
};
Func<float[], IChunkRenderer> factory = m => new FakeRenderer(m);
var streamer = new ChunkStreamer(cfg, world, generate, mesher, registry, executor, factory);
streamer.Tick(new Vector3i(0, 0, 0));
Assert.Equal(1, generateCalls);
Assert.False(streamer.IsReady(new Vector3i(0, 0, 0)));
// Tick again — same chunk, same position. Should NOT call generate again.
streamer.Tick(new Vector3i(0, 0, 0));
Assert.Equal(1, generateCalls);
}
}