diff --git a/shreddedpaper-server/src/main/java/io/multipaper/shreddedpaper/threading/ShreddedPaperChunkTicker.java b/shreddedpaper-server/src/main/java/io/multipaper/shreddedpaper/threading/ShreddedPaperChunkTicker.java index f03627a..2a20ec6 100644 --- a/shreddedpaper-server/src/main/java/io/multipaper/shreddedpaper/threading/ShreddedPaperChunkTicker.java +++ b/shreddedpaper-server/src/main/java/io/multipaper/shreddedpaper/threading/ShreddedPaperChunkTicker.java @@ -74,7 +74,11 @@ private CompletableFuture processTrackQueueInParallel(ServerLevel level) { } allFuture = allFuture.thenCompose(v -> CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new))); - return allFuture; + return allFuture.exceptionally(e -> { + LOGGER.error("Exception processing tracked entities in parallel", e); + MinecraftServer.getServer().moonrise$setChunkSystemCrash(new RuntimeException("Ticking thread crash while processing tracked entities in parallel", e)); + return null; + }); } finally { allFuture.whenComplete((v, e) -> level.chunkScheduler.getRegionLocker().globalLock().tryUnlockWrite()); } @@ -89,7 +93,11 @@ private CompletableFuture flushQueueInParallel(ServerLevel level) { futures.add(CompletableFuture.runAsync(() -> players.forEach(player -> player.connection.connection.flushQueue()), ShreddedPaperTickThread.getExecutor())); } - return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); + return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).exceptionally(e -> { + LOGGER.error("Exception flushing packet queues in parallel", e); + MinecraftServer.getServer().moonrise$setChunkSystemCrash(new RuntimeException("Ticking thread crash while flushing packet queues in parallel", e)); + return null; + }); } private CompletableFuture tickRegion(final ServerLevel level, final LevelChunkRegion region, final long timeInhabited, final List filteredSpawningCategories, final NaturalSpawner.SpawnState spawnState) {