fix/improve world gen/retrieval error handling

This commit is contained in:
James Seibel
2025-12-22 13:53:42 -06:00
parent 1f0c2e286a
commit ce7b9b94b6
2 changed files with 50 additions and 33 deletions
@@ -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
@@ -109,7 +109,7 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende
public CompletableFuture<DataSourceRetrievalResult> 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;
}
});