-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Minor
-
None
-
Affects Version/s: None
-
CraftBukkit version 4502-Spigot-270012a-e74f0d2 (MC: 1.21.5) (Implementing API version 1.21.5-R0.1-SNAPSHOT)
-
Yes
CraftBlockData uses a HashMap called ENUM_VALUES. However, when using BlockData to set blocks within a ChunkGenerator (which is multi-threaded), a ConcurrentModificationException can occur due to HashMap not being thread safe.
java.util.ConcurrentModificationException at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1229) at org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData.toNMS(CraftBlockData.java:190) at org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData.set(CraftBlockData.java:117) at org.bukkit.craftbukkit.v1_21_R4.block.impl.CraftStepAbstract.setType(CraftStepAbstract.java:27) at io.github.mrcomputer1.chunkgen.ChunkGen.generateNoise(ChunkGen.java:23) at org.bukkit.craftbukkit.v1_21_R4.generator.CustomChunkGenerator.lambda$fillFromNoise$0(CustomChunkGenerator.java:258) at org.bukkit.craftbukkit.v1_21_R4.generator.CustomChunkGenerator.lambda$fillFromNoise$1(CustomChunkGenerator.java:263) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
I have included a plugin that contains a ChunkGenerator that seems to pretty often trigger this bug.
PaperMC seems to have fixed this issue by changing the HashMap to be a ConcurrentHashMap (PaperMC PR).