Add protection against hang on shutdown

This commit is contained in:
s809
2023-12-19 23:20:23 +05:00
parent 02aca6f044
commit 904c1a7d71
@@ -1,5 +1,6 @@
package com.seibel.distanthorizons.core.generation;
import com.google.common.base.Stopwatch;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dataObjects.fullData.accessor.ChunkSizedFullDataAccessor;
import com.seibel.distanthorizons.core.dataObjects.fullData.sources.CompleteFullDataSource;
@@ -36,6 +37,8 @@ public class WorldRemoteGenerationQueue implements IWorldGenerationQueue, IDebug
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final long SHUTDOWN_TIMEOUT_SECONDS = 5;
private final ClientNetworkState networkState;
private final IDhClientLevel level;
@@ -252,13 +255,16 @@ public class WorldRemoteGenerationQueue implements IWorldGenerationQueue, IDebug
public CompletableFuture<Void> startClosing(boolean cancelCurrentGeneration, boolean alsoInterruptRunning)
{
return this.generatorClosingFuture = CompletableFuture.runAsync(() -> {
while (!genTaskPriorityRequestSemaphore.tryAcquire())
Stopwatch stopwatch = Stopwatch.createStarted();
do
{
if (genTaskPriorityRequest.cancel(false))
genTaskPriorityRequestSemaphore.release();
}
while (!pendingTasksSemaphore.tryAcquire(Short.MAX_VALUE))
while (!genTaskPriorityRequestSemaphore.tryAcquire() && stopwatch.elapsed(TimeUnit.SECONDS) < SHUTDOWN_TIMEOUT_SECONDS);
do
{
for (WorldGenQueueEntry entry : this.waitingTasks.values())
{
@@ -267,6 +273,10 @@ public class WorldRemoteGenerationQueue implements IWorldGenerationQueue, IDebug
pendingTasksSemaphore.release();
}
}
while (!pendingTasksSemaphore.tryAcquire(Short.MAX_VALUE) && stopwatch.elapsed(TimeUnit.SECONDS) < SHUTDOWN_TIMEOUT_SECONDS);
if (stopwatch.elapsed(TimeUnit.SECONDS) >= SHUTDOWN_TIMEOUT_SECONDS)
LOGGER.warn("Generation queue for " + level.getLevelWrapper() + " did not shutdown in " + SHUTDOWN_TIMEOUT_SECONDS + " seconds! Some unfinished tasks might be left hanging.");
});
}