Skip to content

[1.21.1] Block replacements can cause watchdog crashes #10

@noobanidus

Description

@noobanidus

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions