Skip to content

CraftPlayer.onEntityRemove is not thread safe, crashing server #406

@Rothes

Description

@Rothes

Stack trace

Region #~ centered at chunk [~, ~] in world 'world_nether' failed to tick:                               
net.minecraft.ReportedException: Exception ticking world                                                                                                                                  
        at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1878) ~[server-1.21.8.jar]                                                             
        at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1693) ~[server-1.21.8.jar]                                                               
        at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:409) ~[server-1.21.8.jar]                                   
        at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:437) ~[server-1.21.8.jar]                          
        at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:546) ~[concurrentutil-0.0.3.jar:?]                                   
        at java.base/java.lang.Thread.run(Thread.java:1474) ~[?:?]                                                                                                                        
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 2049                                                                                               
        at it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap.rehash(Object2ObjectOpenHashMap.java:1281) ~[fastutil-8.5.15.jar:?]                                                     
        at it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap.removeEntry(Object2ObjectOpenHashMap.java:209) ~[fastutil-8.5.15.jar:?]                                                 
        at it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap.remove(Object2ObjectOpenHashMap.java:308) ~[fastutil-8.5.15.jar:?]                                                      
        at org.bukkit.craftbukkit.entity.CraftPlayer.onEntityRemove(CraftPlayer.java:2212) ~[server-1.21.8.jar]                                                          
        at net.minecraft.server.level.ServerLevel$EntityCallbacks.onTrackingEnd(ServerLevel.java:2989) ~[server-1.21.8.jar]                                              
        at net.minecraft.server.level.ServerLevel$EntityCallbacks.onTrackingEnd(ServerLevel.java:2834) ~[server-1.21.8.jar]                                              
        at ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup.entityStatusChange(EntityLookup.java:304) ~[server-1.21.8.jar]                         
        at ca.spottedleaf.moonrise.patches.chunk_system.level.entity.ChunkEntitySlices.updateStatus(ChunkEntitySlices.java:255) ~[server-1.21.8.jar]                     
        at ca.spottedleaf.moonrise.patches.chunk_system.level.entity.EntityLookup.chunkStatusChange(EntityLookup.java:334) ~[server-1.21.8.jar]                          
        at ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder.changeEntityChunkStatus(NewChunkHolder.java:1212) ~[server-1.21.8.jar]                 
        at ca.spottedleaf.moonrise.patches.chunk_system.scheduling.NewChunkHolder.handleFullStatusChange(NewChunkHolder.java:1310) ~[server-1.21.8.jar]                  
        at ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkHolderManager.processPendingFullUpdate(ChunkHolderManager.java:1637) ~[server-1.21.8.jar]        
        at ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkHolderManager.processTicketUpdates(ChunkHolderManager.java:1606) ~[server-1.21.8.jar]            
        at ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkHolderManager.tick(ChunkHolderManager.java:1031) ~[server-1.21.8.jar]                            
        at net.minecraft.world.level.TicketStorage.purgeStaleTickets(TicketStorage.java:254) ~[server-1.21.8.jar]                                                        
        at net.minecraft.server.level.ServerChunkCache.tick(ServerChunkCache.java:499) ~[server-1.21.8.jar]                                                              
        at net.minecraft.server.level.ServerLevel.tick(ServerLevel.java:791) ~[server-1.21.8.jar]                                                                        
        at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1873) ~[server-1.21.8.jar]                                                             
        ... 5 more

Plugin and Datapack List

plugins: ESU

Actions to reproduce (if known)

ESU is a plugin, which uses Player.hideEntity on player entity scheduler.

onEntityRemove and it may write to the map at the same time.

Folia version

ALL

Other

net.minecraft.server.level.ServerLevel$EntityCallbacks.onTrackingEnd(ServerLevel.java:2989)

            // Folia - region threading - TODO THIS SHIT
            if (!(entity instanceof ServerPlayer)) {
                for (ServerPlayer player : ServerLevel.this.server.getPlayerList().players) { // Paper - call onEntityRemove for all online players
                    player.getBukkitEntity().onEntityRemove(entity);
                }
            }

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugSomething doesn't work as it was intended to.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions