From ce7b9b94b625edf02cf3e7cd345e4c1cc1b1b7ee Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 22 Dec 2025 13:53:42 -0600 Subject: [PATCH] fix/improve world gen/retrieval error handling --- .../GeneratedFullDataSourceProvider.java | 65 ++++++++++++------- .../AbstractFullDataNetworkRequestQueue.java | 18 ++--- 2 files changed, 50 insertions(+), 33 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 19af9475e..b0d3257b5 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 @@ -118,33 +118,45 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im private void onWorldGenTaskComplete(DataSourceRetrievalResult genTaskResult, Throwable exception) { - if (genTaskResult.state == ERetrievalResultState.FAIL) + try { - LodUtil.assertTrue(genTaskResult.dataSource == null, "Errored retrieval object should not have a datasource."); - - // don't log shutdown exceptions - if (!ExceptionUtil.isInterruptOrReject(exception)) + if (exception != null) { - LOGGER.error("Uncaught Gen Task Exception at ["+genTaskResult.pos+"], error: ["+exception.getMessage()+"].", exception); + 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); + } + } + else if (genTaskResult.state == ERetrievalResultState.SUCCESS) + { + LodUtil.assertTrue(genTaskResult.dataSource != null, "Successful retrieval object should have a datasource."); + + this.dataUpdater.updateDataSource(genTaskResult.dataSource); + this.fireOnGenPosSuccessListeners(genTaskResult.pos); + genTaskResult.dataSource.close(); + } + else if (genTaskResult.state == ERetrievalResultState.REQUIRES_SPLITTING) + { + // task was split + LodUtil.assertTrue(genTaskResult.dataSource == null, "Split retrieval object should not have a datasource."); + } + else + { + // shouldn't happen, but just in case + LOGGER.warn("Unexpected gen Task state at: [" + DhSectionPos.toString(genTaskResult.pos) + "], state: [" + genTaskResult.state + "], datasource: NULL, exception: NULL."); } } - else if (genTaskResult.state == ERetrievalResultState.SUCCESS) + catch (Exception e) { - LodUtil.assertTrue(genTaskResult.dataSource != null, "Successful retrieval object should have a datasource."); - - this.dataUpdater.updateDataSource(genTaskResult.dataSource); - this.fireOnGenPosSuccessListeners(genTaskResult.pos); - genTaskResult.dataSource.close(); - } - else if (genTaskResult.state == ERetrievalResultState.REQUIRES_SPLITTING) - { - // task was split - LodUtil.assertTrue(genTaskResult.dataSource == null, "Split retrieval object should not have a datasource."); - } - else - { - // shouldn't happen, but just in case - LOGGER.warn("Unexpected gen Task state at: [" + DhSectionPos.toString(genTaskResult.pos) + "], state: ["+genTaskResult.state+"], datasource: NULL, exception: NULL."); + LOGGER.error("Unexpected issue during onWorldGenTaskComplete, error: ["+e.getMessage()+"].", e); } } @@ -267,12 +279,15 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im int availableTaskSlots = maxWorldGenQueueCount - worldGenQueue.getWaitingTaskCount(); - if (availableTaskSlots <= 0) + if (availableTaskSlots == 0) + { + return false; + } + else if (availableTaskSlots < 0) { - //if (false) if (pruneWaitingTasksAboveLimit) { - AtomicInteger tasksToCancel = new AtomicInteger(-availableTaskSlots + 1); + AtomicInteger tasksToCancel = new AtomicInteger(availableTaskSlots * -1); worldGenQueue.removeRetrievalRequestIf(taskPos -> tasksToCancel.getAndDecrement() > 0); } else 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 5a2c3cc0b..30ea5b60a 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 @@ -109,7 +109,7 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende public CompletableFuture submitRequest(long sectionPos, @Nullable Long clientTimestamp) { - NetRequestTask requestEntry = this.waitingTasksBySectionPos.compute(sectionPos, (pos, existingNetTask) -> + NetRequestTask requestEntry = this.waitingTasksBySectionPos.compute(sectionPos, (Long pos, NetRequestTask existingNetTask) -> { // ignore already queued tasks if (existingNetTask != null) @@ -123,6 +123,15 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende { this.waitingTasksBySectionPos.remove(pos); + if (throwable != null) + { + if (!(throwable instanceof CancellationException)) + { + this.failedRequests.incrementAndGet(); + } + return; + } + switch (requestResult.state) { case SUCCESS: @@ -133,13 +142,6 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende case FAIL: this.failedRequests.incrementAndGet(); break; - default: - if (throwable != null - && !(throwable instanceof CancellationException)) - { - this.failedRequests.incrementAndGet(); - } - break; } });