WiIIiam278 / HuskSync

A modern, cross-server player data synchronisation system
https://william278.net/project/husksync
Apache License 2.0
152 stars 125 forks source link

ConcurrentModificationException when saving attribute data under certain conditions #282

Closed WiIIiam278 closed 6 days ago

WiIIiam278 commented 3 months ago

This seems to be safe to ignore, though. Basically it seems like Minecraft is trying to do stuff with attributes while we're trying to read it.

Stack trace ``` java.util.ConcurrentModificationException: null at java.util.HashMap.computeIfAbsent(HashMap.java:1221) ~[?:?] at net.minecraft.world.entity.ai.attributes.AttributeMap.m_22146_(AttributeMap.java:49) ~[server-1.20.2-20230921.100330-srg.jar%23186!/:?] at org.bukkit.craftbukkit.v1_20_R2.attribute.CraftAttributeMap.getAttribute(CraftAttributeMap.java:19) ~[forge-1.20.2-48.1.0-universal.jar%23191!/:?] at org.bukkit.craftbukkit.v1_20_R2.entity.CraftLivingEntity.getAttribute(CraftLivingEntity.java:640) ~[forge-1.20.2-48.1.0-universal.jar%23191!/:?] at net.william278.husksync.data.BukkitData$Attributes.lambda$adapt$0(BukkitData.java:571) ~[?:?] at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?] at net.william278.husksync.data.BukkitData$Attributes.adapt(BukkitData.java:570) ~[?:?] at net.william278.husksync.data.BukkitUserDataHolder.getAttributes(BukkitUserDataHolder.java:124) ~[?:?] at net.william278.husksync.data.BukkitUserDataHolder.getData(BukkitUserDataHolder.java:44) ~[?:?] at net.william278.husksync.data.UserDataHolder.lambda$getData$1(UserDataHolder.java:47) ~[?:?] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?] at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?] at java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?] at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) ~[?:?] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[?:?] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:693) ~[?:?] at net.william278.husksync.data.UserDataHolder.getData(UserDataHolder.java:49) ~[?:?] at net.william278.husksync.data.UserDataHolder.createSnapshot(UserDataHolder.java:75) ~[?:?] at net.william278.husksync.listener.EventListener.lambda$saveOnWorldSave$1(EventListener.java:84) ~[?:?] at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[?:?] at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[?:?] at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[?:?] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[?:?] at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[?:?] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[?:?] at net.william278.husksync.listener.EventListener.saveOnWorldSave(EventListener.java:83) ~[?:?] at net.william278.husksync.listener.BukkitEventListener.lambda$onWorldSave$1(BukkitEventListener.java:112) ~[?:?] at org.bukkit.craftbukkit.v1_20_R2.scheduler.CraftTask.run(CraftTask.java:77) ~[forge-1.20.2-48.1.0-universal.jar%23191!/:?] at org.bukkit.craftbukkit.v1_20_R2.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54) [forge-1.20.2-48.1.0-universal.jar%23191!/:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?] at java.lang.Thread.run(Thread.java:840) [?:?] ```