Fix PWT deadlock with plugin sync tasks#766
Conversation
|
经测试issue内的那种mythicmobs的报错没了,现在换了几种新崩服报错 还有两种新的crash报错 |
|
经测试mythicmobs的报错回来了 |
|
https://github.com/Winds-Studio/Leaf/actions/runs/27474418760 刚发现这个插件还留着,现在已经删了用gamerule了,顺便留了个样本 |
mythicmobs 这插件太黑箱了,我得花点时间想想怎么办了。 |
刚才看了一下代码,这插件在玩家死的时候延迟1tick调用player.spawn方法来复活 |
|
经测试还是会崩,下面是日志 |
|
经测试有时候会出现下面的报错 |
PWT 下,MinecraftServer#tickChildren 分发 tick 各自的线程时,主线程则硬阻塞等待全部完成,会卡在 tasks.pop().get()
当插件(例如 MythicMobs)在某个世界 tick 线程里调用 callSyncAndJoin() 会通过 Bukkit.getScheduler().runTask() 把任务丢进 CraftScheduler 队列,然后阻塞等结果。
而该队列只在 tickChildren 开头跑一次 heartbeat,此时主线程卡死了,世界线程等主线程跑任务、主线程等世界线程跑完导致了互锁。
解决方法
把任务在对应世界 tick 内联执行(不丢回主线程了)。
fix: #728