From 505dbe2f62ba20d00a832554768b3a0b88461c42 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Sat, 27 Dec 2025 00:51:30 +0500 Subject: [PATCH] Replace the failure state with future exceptions --- .../GeneratedFullDataSourceProvider.java | 19 ++++++++----------- .../core/generation/PregenManager.java | 4 ++-- .../core/generation/WorldGenerationQueue.java | 8 +++++--- .../tasks/DataSourceRetrievalResult.java | 1 - .../tasks/ERetrievalResultState.java | 2 -- .../AbstractFullDataNetworkRequestQueue.java | 7 ++----- .../core/render/LodQuadTree.java | 7 +------ 7 files changed, 18 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java index b0d3257b5..0167dc8ed 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/GeneratedFullDataSourceProvider.java @@ -44,6 +44,7 @@ import com.seibel.distanthorizons.core.util.threading.PriorityTaskPicker; import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import it.unimi.dsi.fastutil.bytes.ByteArrayList; import it.unimi.dsi.fastutil.longs.LongArrayList; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -116,26 +117,22 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im // events // //========// - private void onWorldGenTaskComplete(DataSourceRetrievalResult genTaskResult, Throwable exception) + private void onWorldGenTaskComplete(@NotNull Long genPos, @Nullable DataSourceRetrievalResult genTaskResult, @Nullable Throwable exception) { try { if (exception != null) { - return; - } - - if (genTaskResult.state == ERetrievalResultState.FAIL) - { - LodUtil.assertTrue(genTaskResult.dataSource == null, "Errored retrieval object should not have a datasource."); - // don't log shutdown exceptions if (!ExceptionUtil.isInterruptOrReject(exception)) { - LOGGER.error("Uncaught Gen Task Exception at [" + genTaskResult.pos + "], error: [" + exception.getMessage() + "].", exception); + LOGGER.error("Uncaught Gen Task Exception at [" + genPos + "], error: [" + exception.getMessage() + "].", exception); } + return; } - else if (genTaskResult.state == ERetrievalResultState.SUCCESS) + + Objects.requireNonNull(genTaskResult); + if (genTaskResult.state == ERetrievalResultState.SUCCESS) { LodUtil.assertTrue(genTaskResult.dataSource != null, "Successful retrieval object should have a datasource."); @@ -310,7 +307,7 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im } CompletableFuture worldGenFuture = worldGenQueue.submitRetrievalTask(genPos, (byte) (DhSectionPos.getDetailLevel(genPos) - DhSectionPos.SECTION_MINIMUM_DETAIL_LEVEL)); - worldGenFuture.whenComplete(this::onWorldGenTaskComplete); + worldGenFuture.whenComplete((r, e) -> this.onWorldGenTaskComplete(genPos, r, e)); return worldGenFuture; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/PregenManager.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/PregenManager.java index 80407b5af..ae19f4c80 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/PregenManager.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/PregenManager.java @@ -157,9 +157,9 @@ public class PregenManager else { this.fullDataSourceProvider.queuePositionForRetrieval(fullDataSource.getPos()) - .thenAccept((DataSourceRetrievalResult result) -> + .whenComplete((DataSourceRetrievalResult result, Throwable throwable) -> { - if (result.state == ERetrievalResultState.FAIL) + if (throwable != null) { LOGGER.warn("Failed to generate section " + DhSectionPos.toString(result.pos)); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java index 46d9c014f..795cf4f72 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java @@ -92,7 +92,7 @@ public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDeb private int estimatedRemainingChunkCount = 0; private final RollingAverage rollingAverageChunkGenTimeInMs = new RollingAverage(Runtime.getRuntime().availableProcessors() * 500); - public RollingAverage getRollingAverageChunkGenTimeInMs() { return this.rollingAverageChunkGenTimeInMs; } + @Override public RollingAverage getRollingAverageChunkGenTimeInMs() { return this.rollingAverageChunkGenTimeInMs; } @@ -128,7 +128,9 @@ public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDeb // the generator is shutting down, don't add new tasks if (this.generatorClosingFuture != null) { - return CompletableFuture.completedFuture(DataSourceRetrievalResult.CreateFail()); + CompletableFuture f = new CompletableFuture<>(); + f.completeExceptionally(new CancellationException()); + return f; } // use the existing task if present @@ -362,7 +364,7 @@ public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDeb } LodUtil.assertTrue(fullDataSource == null); - worldGenTask.future.complete(DataSourceRetrievalResult.CreateFail()); + worldGenTask.future.completeExceptionally(exception); } else { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/DataSourceRetrievalResult.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/DataSourceRetrievalResult.java index 0872be132..41f84165c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/DataSourceRetrievalResult.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/DataSourceRetrievalResult.java @@ -40,7 +40,6 @@ public class DataSourceRetrievalResult //==============// public static DataSourceRetrievalResult CreateSplit() { return new DataSourceRetrievalResult(ERetrievalResultState.REQUIRES_SPLITTING, 0, null); } - public static DataSourceRetrievalResult CreateFail() { return new DataSourceRetrievalResult(ERetrievalResultState.FAIL, 0, null); } public static DataSourceRetrievalResult CreateSuccess(long pos, FullDataSourceV2 generatedDataSource) { return new DataSourceRetrievalResult(ERetrievalResultState.SUCCESS, pos, generatedDataSource); } private DataSourceRetrievalResult(ERetrievalResultState state, long pos, @Nullable FullDataSourceV2 dataSource) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/ERetrievalResultState.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/ERetrievalResultState.java index 5b58cefd5..d5ae131b0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/ERetrievalResultState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/tasks/ERetrievalResultState.java @@ -3,7 +3,6 @@ package com.seibel.distanthorizons.core.generation.tasks; /** * SUCCESS
* REQUIRES_SPLITTING
- * FAIL
* * @see DataSourceRetrievalResult */ @@ -11,5 +10,4 @@ public enum ERetrievalResultState { SUCCESS, REQUIRES_SPLITTING, - FAIL, } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java index 30ea5b60a..9b46433aa 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java @@ -139,9 +139,6 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende break; case REQUIRES_SPLITTING: break; - case FAIL: - this.failedRequests.incrementAndGet(); - break; } }); @@ -269,7 +266,7 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende catch (RequestRejectedException e) { LOGGER.info("Request rejected by the server, message: [" + e.getMessage() + "]."); - requestTask.future.complete(DataSourceRetrievalResult.CreateFail()); + requestTask.future.completeExceptionally(e); } catch (RateLimitedException e) { @@ -298,7 +295,7 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende } else { - requestTask.future.complete(DataSourceRetrievalResult.CreateFail()); + requestTask.future.completeExceptionally(e); } } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java index d64693fe4..d223b6d8e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java @@ -622,12 +622,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen // task finished this.queuedGenerationPosSet.remove(missingPos); - // if the task failed re-queue so we can try again - if (result.state == ERetrievalResultState.FAIL) - { - this.missingGenerationPosSet.add(missingPos); - } - else if (result.state == ERetrievalResultState.REQUIRES_SPLITTING) + if (result.state == ERetrievalResultState.REQUIRES_SPLITTING) { DhSectionPos.forEachChild(missingPos, (long childPos) -> {