feat: ChunkStreamer tracks failed chunks to prevent retry storms
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user