fix/improve world gen/retrieval error handling
This commit is contained in:
+40
-25
@@ -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
|
||||
|
||||
+10
-8
@@ -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;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user