-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Some blocks (especially CopperBulbBlock) have effects when placed which, when replacement happens near a chunk border, can result in the server thread attempting to chunk load ungenerated chunks and then blocking until the chunk becomes available.
This generally causes a watch dog crash.
This is something I experienced in Lootr around 1.17 when chunk loading changed, and my solution was to keep a record of fully loaded & ticking chunks via the chunk loaded event, and deferring any setBlockState calls until the entire 5x5 with the relevant chunk in the center was fully loaded.
This obviously requires deferring all replacements to a server-end-tick based process which would obviously complicate your code quite a bit more.
I'm not sure if there's any programmatic way to detect if a block is likely to cause this type of "cascading" chunk loading (to steal a term from 1.12).
This was originally reported as a potential Lootr issue on my Discord. Here's the relevant section from the log:
"Server thread" prio=4 Id=252 TIMED_WAITING on java.lang.String@2ed7e053
at java.base@21.0.9/jdk.internal.misc.Unsafe.park(Native Method)
- waiting on java.lang.String@2ed7e053
at java.base@21.0.9/java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.util.thread.BlockableEventLoop.waitForTasks(BlockableEventLoop.java:143)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:133)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.managedBlock(ServerChunkCache.java:533)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ServerChunkCache.getChunk(ServerChunkCache.java:159)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.Level.getChunk(Level.java:202)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.LevelReader.getChunk(LevelReader.java:130)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.Level.getChunk(Level.java:196)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.Level.getBlockState(Level.java:382)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.SignalGetter.getDirectSignal(SignalGetter.java:14)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.SignalGetter.getDirectSignalTo(SignalGetter.java:27)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.SignalGetter.getSignal(SignalGetter.java:68)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.SignalGetter.hasNeighborSignal(SignalGetter.java:74)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.block.CopperBulbBlock.checkAndFlip(CopperBulbBlock.java:46)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.block.CopperBulbBlock.onPlace(CopperBulbBlock.java:34)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase.onPlace(BlockBehaviour.java:718)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.chunk.LevelChunk.setBlockState(LevelChunk.java:283)
at TRANSFORMER/bblcompat@5.6.4/com.benbenlaw.opoliscompat.event.BlockReplacingEvent.onChunkGenerationRemovals(BlockReplacingEvent.java:59)
at java.base@21.0.9/java.lang.invoke.LambdaForm$DMH/0x0000014b0102c400.invokeStatic(LambdaForm$DMH)
at java.base@21.0.9/java.lang.invoke.LambdaForm$MH/0x0000014b06b50400.invoke(LambdaForm$MH)
at java.base@21.0.9/java.lang.invoke.LambdaForm$MH/0x0000014b01490c00.invokeExact_MT(LambdaForm$MH)
at MC-BOOTSTRAP/net.neoforged.bus/net.neoforged.bus.EventListenerFactory$onChunkGenerationRemovals/0x0000014b023f0400.invoke(.dynamic)
at MC-BOOTSTRAP/net.neoforged.bus/net.neoforged.bus.EventBus.post(EventBus.java:360)
at MC-BOOTSTRAP/net.neoforged.bus/net.neoforged.bus.EventBus.post(EventBus.java:328)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.chunk.status.ChunkStatusTasks.lambda$full$2(ChunkStatusTasks.java:215)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.world.level.chunk.status.ChunkStatusTasks$$Lambda/0x0000014b06568ef8.get(Unknown Source)
at java.base@21.0.9/java.util.concurrent.CompletableFuture$AsyncSupply.run(Unknown Source)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ChunkTaskPriorityQueueSorter.lambda$message$1(ChunkTaskPriorityQueueSorter.java:62)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ChunkTaskPriorityQueueSorter$$Lambda/0x0000014b065453e8.run(Unknown Source)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:148)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.doRunTask(ServerChunkCache.java:559)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:122)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ServerChunkCache$MainThreadExecutor.pollTask(ServerChunkCache.java:568)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.level.ServerChunkCache.pollTask(ServerChunkCache.java:275)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:860)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:849)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.util.thread.BlockableEventLoop.runAllTasks(BlockableEventLoop.java:111)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:825)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:712)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer.lambda$spin$2(MinecraftServer.java:267)
at TRANSFORMER/minecraft@1.21.1/net.minecraft.server.MinecraftServer$$Lambda/0x0000014b064ccc68.run(Unknown Source)
at java.base@21.0.9/java.lang.Thread.runWith(Unknown Source)
at java.base@21.0.9/java.lang.Thread.run(Unknown Source)Here's the relevant version numbers from the log:
BBL Cloche 1.3.7 (cloche)
BBL Colors 1.4.0 (colors)
BBL Compat 5.6.4 (bblcompat)
BBL Core 1.3.20 (bblcore)
BBL Invisible Lights 1.1.2 (bbllights)
BBL Resource Fish 1.4.0 (resourcefish)
BBL Routers 1.1.5 (routers)
BBL Shops 1.3.3 (shops)
BBL Smart Crafting Table 1.2.11 (smartcrafting)
BBL Strainers 5.2.1 (strainers)
BBL TIAB Charger 1.0.5 (tiab_charger)
If you'd like a copy of the full log, please let me know. I'm unsure if it contains any potentially private information these days.