PaperMC / Folia

Fork of Paper which adds regionised multithreading to the dedicated server.
GNU General Public License v3.0
3.52k stars 444 forks source link

Server crash on player disconnect (something in PlayerQuitEvent) #219

Open gummianka opened 5 months ago

gummianka commented 5 months ago

Stack trace

[10:30:13 INFO]: gummi_anka lost connection: Disconnected
[10:30:13 ERROR]: Thread Region Scheduler Thread #0 failed main thread check: Cannot remove entity off-main
java.lang.Throwable: null
  at io.papermc.paper.util.TickThread.ensureTickThread(TickThread.java:78) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.Entity.setRemoved(Entity.java:5602) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.Entity.remove(Entity.java:708) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.LivingEntity.remove(LivingEntity.java:783) ~[?:?]
  at net.minecraft.world.entity.player.Player.remove(Player.java:1522) ~[?:?]
  at net.minecraft.server.level.ServerLevel.removePlayerImmediately(ServerLevel.java:1932) ~[?:?]
  at net.minecraft.server.players.PlayerList.remove(PlayerList.java:757) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.players.PlayerList.remove(PlayerList.java:696) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.removePlayerFromWorld(ServerGamePacketListenerImpl.java:2143) ~[?:?]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2121) ~[?:?]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2108) ~[?:?]
  at net.minecraft.network.Connection.handleDisconnection(Connection.java:894) ~[?:?]
  at io.papermc.paper.threadedregions.RegionizedWorldData.tickConnections(RegionizedWorldData.java:516) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1843) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:447) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1657) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:407) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:404) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:525) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at java.lang.Thread.run(Thread.java:1583) ~[?:?]
[10:30:13 ERROR]: [io.papermc.paper.threadedregions.TickRegionScheduler] Region #1 centered at chunk [41, 53] in world 'arena' failed to tick:
java.lang.IllegalStateException: Cannot remove entity off-main
  at io.papermc.paper.util.TickThread.ensureTickThread(TickThread.java:79) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.Entity.setRemoved(Entity.java:5602) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.Entity.remove(Entity.java:708) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.world.entity.LivingEntity.remove(LivingEntity.java:783) ~[?:?]
  at net.minecraft.world.entity.player.Player.remove(Player.java:1522) ~[?:?]
  at net.minecraft.server.level.ServerLevel.removePlayerImmediately(ServerLevel.java:1932) ~[?:?]
  at net.minecraft.server.players.PlayerList.remove(PlayerList.java:757) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.players.PlayerList.remove(PlayerList.java:696) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.removePlayerFromWorld(ServerGamePacketListenerImpl.java:2143) ~[?:?]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2121) ~[?:?]
  at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2108) ~[?:?]
  at net.minecraft.network.Connection.handleDisconnection(Connection.java:894) ~[?:?]
  at io.papermc.paper.threadedregions.RegionizedWorldData.tickConnections(RegionizedWorldData.java:516) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1843) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:447) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1657) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:407) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:404) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:525) ~[folia-1.20.4.jar:git-Folia-"2986554"]
  at java.lang.Thread.run(Thread.java:1583) ~[?:?]

Plugin and Datapack List

MyOwnPlugin, GrimAC, Chunky, ProtocolLib, ViaBackwards, ViaVersion, WorldEdit, spark

Actions to reproduce (if known)

I have my own duels minigame plugin, when a player leaves from a duel (disconnect, command) I call:

player.teleportAsync(loc)
player.getInventory().clear();
player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(20);
player.setHealth(20);
player.setFoodLevel(20);
player.setSaturation(0);
player.setExhaustion(0);
player.setFireTicks(0);

for (PotionEffect effect : player.getActivePotionEffects()) {
    player.removePotionEffect(effect.getType());
}

On paper it was fine to do this on PlayerQuitEvent, I have disabled calling these methods and the server stopped crashing on player disconnect.

Folia version

git-Folia-"2986554" (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 2986554)

Other

I patched folia myself for some changes for my server, but also on "clear" folia with last commit 25ee657a8290530812f5f93f62d48df541a02ccf I can reproduce same issue

electronicboy commented 5 months ago

We cannot accept stack traces from software that isn't ours

gummianka commented 5 months ago

I tried to reproduce this issue on full empty server, only with plugin with PlayerQuitEvent, tried to teleport player to different worlds, but there is no crash.

But I can still reproduce this crash with my plugins on clear folia. This stack traces doesnt contains my methods, that is why I created this issue

This server is running Folia version git-Folia-"25ee657" (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 25ee657)\nYou are running the latest version

[14:34:00] [Region Scheduler Thread #1/INFO]: gummi_anka lost connection: Disconnected
[14:34:00] [Region Scheduler Thread #1/ERROR]: Thread Region Scheduler Thread #1 failed main thread check: Cannot remove entity off-main
java.lang.Throwable: null
    at io.papermc.paper.util.TickThread.ensureTickThread(TickThread.java:78) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.Entity.setRemoved(Entity.java:5588) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.Entity.remove(Entity.java:708) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.LivingEntity.remove(LivingEntity.java:783) ~[?:?]
    at net.minecraft.world.entity.player.Player.remove(Player.java:1522) ~[?:?]
    at net.minecraft.server.level.ServerLevel.removePlayerImmediately(ServerLevel.java:1932) ~[?:?]
    at net.minecraft.server.players.PlayerList.remove(PlayerList.java:757) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.players.PlayerList.remove(PlayerList.java:696) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.removePlayerFromWorld(ServerGamePacketListenerImpl.java:2143) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2121) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2108) ~[?:?]
    at net.minecraft.network.Connection.handleDisconnection(Connection.java:894) ~[?:?]
    at io.papermc.paper.threadedregions.RegionizedWorldData.tickConnections(RegionizedWorldData.java:516) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1843) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:447) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1657) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:407) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:404) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:525) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at java.lang.Thread.run(Thread.java:1583) ~[?:?]
[14:34:00] [Region Scheduler Thread #1/ERROR]: [io.papermc.paper.threadedregions.TickRegionScheduler] Region #1 centered at chunk [41, 53] in world 'arena' failed to tick:
java.lang.IllegalStateException: Cannot remove entity off-main
    at io.papermc.paper.util.TickThread.ensureTickThread(TickThread.java:79) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.Entity.setRemoved(Entity.java:5588) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.Entity.remove(Entity.java:708) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.world.entity.LivingEntity.remove(LivingEntity.java:783) ~[?:?]
    at net.minecraft.world.entity.player.Player.remove(Player.java:1522) ~[?:?]
    at net.minecraft.server.level.ServerLevel.removePlayerImmediately(ServerLevel.java:1932) ~[?:?]
    at net.minecraft.server.players.PlayerList.remove(PlayerList.java:757) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.players.PlayerList.remove(PlayerList.java:696) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.removePlayerFromWorld(ServerGamePacketListenerImpl.java:2143) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2121) ~[?:?]
    at net.minecraft.server.network.ServerGamePacketListenerImpl.onDisconnect(ServerGamePacketListenerImpl.java:2108) ~[?:?]
    at net.minecraft.network.Connection.handleDisconnection(Connection.java:894) ~[?:?]
    at io.papermc.paper.threadedregions.RegionizedWorldData.tickConnections(RegionizedWorldData.java:516) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.MinecraftServer.tickChildren(MinecraftServer.java:1843) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:447) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1657) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:407) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:404) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:525) ~[folia-1.20.4.jar:git-Folia-"25ee657"]
    at java.lang.Thread.run(Thread.java:1583) ~[?:?]
[14:34:00] [Region shutdown thread/INFO]: [RegionShutdownThread] Awaiting scheduler termination for 60s
[14:34:00] [Region shutdown thread/INFO]: [RegionShutdownThread] Scheduler halted
[14:34:00] [Region shutdown thread/INFO]: Stopping server
PedroMPagani commented 5 months ago

player.teleportAsync(loc) player.getInventory().clear(); player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(20); player.setHealth(20); player.setFoodLevel(20); player.setSaturation(0); player.setExhaustion(0); player.setFireTicks(0);

for (PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); }

these actions on a player quit are kind of "dumb", you should schedule those actions for the new player join event instead