diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java index ea1c6f4..efcd477 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java @@ -86,6 +86,13 @@ abstract class ServerChunkCacheMixin extends ChunkSource implements ChunkSystemS completable::complete ); + if (!completable.isDone() && chunkTaskScheduler.hasShutdown()) { + throw new IllegalStateException( + "Chunk system has shut down, cannot process chunk requests in world '" + ca.spottedleaf.moonrise.common.util.WorldUtil.getWorldName(this.level) + "' at " + + "(" + chunkX + "," + chunkZ + ") status: " + toStatus + ); + } + if (TickThread.isTickThreadFor(this.level, chunkX, chunkZ)) { ChunkTaskScheduler.pushChunkWait(this.level, chunkX, chunkZ); this.mainThreadProcessor.managedBlock(completable::isDone); diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java index 8041b38..bc4f271 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java @@ -219,6 +219,8 @@ public final class ChunkHolderManager { LOGGER.error("Failed to close '" + type.name() + "' regionfile cache for world '" + WorldUtil.getWorldName(this.world) + "'", ex); } } + + this.taskScheduler.setShutdown(true); } void ensureInAutosave(final NewChunkHolder holder) { diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java index 9c1dc6a..eb77db5 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkTaskScheduler.java @@ -271,6 +271,16 @@ public final class ChunkTaskScheduler { return this.lockShift; } + private volatile boolean shutdown; + + public boolean hasShutdown() { + return this.shutdown; + } + + public void setShutdown(final boolean shutdown) { + this.shutdown = shutdown; + } + public ChunkTaskScheduler(final ServerLevel world) { this.world = world; // must be >= region shift (in paper, doesn't exist) and must be >= ticket propagator section shift @@ -525,6 +535,13 @@ public final class ChunkTaskScheduler { return loaded; } + if (this.hasShutdown()) { + throw new IllegalStateException( + "Chunk system has shut down, cannot process chunk requests in world '" + ca.spottedleaf.moonrise.common.util.WorldUtil.getWorldName(this.world) + "' at " + + "(" + chunkX + "," + chunkZ + ") status: " + status + ); + } + final Long ticketId = getNextNonFullLoadId(); final int ticketLevel = getTicketLevel(status); this.chunkHolderManager.addTicketAtLevel(NON_FULL_CHUNK_LOAD, chunkX, chunkZ, ticketLevel, ticketId);