From e2f743d9145920319197ba3f4946e335fc3bee1c Mon Sep 17 00:00:00 2001 From: Jason <11360596+jpenilla@users.noreply.github.com> Date: Sun, 27 Mar 2022 10:51:39 -0700 Subject: Fix PalettedContainer synchronization (#7663) --- ...-PalettedContainer-instead-of-ReentrantLo.patch | 86 -------------------- ...-PalettedContainer-instead-of-ThreadingDe.patch | 91 ++++++++++++++++++++++ 2 files changed, 91 insertions(+), 86 deletions(-) delete mode 100644 patches/server/0663-Synchronize-PalettedContainer-instead-of-ReentrantLo.patch create mode 100644 patches/server/0663-Synchronize-PalettedContainer-instead-of-ThreadingDe.patch diff --git a/patches/server/0663-Synchronize-PalettedContainer-instead-of-ReentrantLo.patch b/patches/server/0663-Synchronize-PalettedContainer-instead-of-ReentrantLo.patch deleted file mode 100644 index 670063cc65..0000000000 --- a/patches/server/0663-Synchronize-PalettedContainer-instead-of-ReentrantLo.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Fri, 29 May 2020 20:29:02 -0400 -Subject: [PATCH] Synchronize PalettedContainer instead of ReentrantLock - -Mojang has flaws in their logic about chunks being concurrently -wrote to. So we constantly see crashes around multiple threads writing. - -Additionally, java has optimized synchronization so well that its -in many times faster than trying to manage read wrote locks for low -contention situations. - -And this is extremely a low contention situation. - -diff --git a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java -index 45a969f97b26e328e34f3d576557999c32b954a2..83dc9550f4ed2a138d4ece2765273e555cda994a 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java -+++ b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java -@@ -35,11 +35,11 @@ public class PalettedContainer implements PaletteResize { - private final ThreadingDetector threadingDetector = new ThreadingDetector("PalettedContainer"); - - public void acquire() { -- this.threadingDetector.checkAndLock(); -+ // this.threadingDetector.checkAndLock(); // Paper - disable this - use proper synchronization - } - - public void release() { -- this.threadingDetector.checkAndUnlock(); -+ // this.threadingDetector.checkAndUnlock(); // Paper - disable this - } - - // Paper start - Anti-Xray - Add preset values -@@ -143,7 +143,7 @@ public class PalettedContainer implements PaletteResize { - } - // Paper end - -- public T getAndSet(int x, int y, int z, T value) { -+ public synchronized T getAndSet(int x, int y, int z, T value) { // Paper - synchronize - this.acquire(); - - Object var5; -@@ -166,7 +166,7 @@ public class PalettedContainer implements PaletteResize { - return this.data.palette.valueFor(j); - } - -- public void set(int x, int y, int z, T value) { -+ public synchronized void set(int x, int y, int z, T value) { // Paper - synchronize - this.acquire(); - - try { -@@ -200,7 +200,7 @@ public class PalettedContainer implements PaletteResize { - }); - } - -- public void read(FriendlyByteBuf buf) { -+ public synchronized void read(FriendlyByteBuf buf) { // Paper - synchronize - this.acquire(); - - try { -@@ -218,7 +218,7 @@ public class PalettedContainer implements PaletteResize { - - // Paper start - Anti-Xray - Add chunk packet info - @Deprecated public void write(FriendlyByteBuf buf) { this.write(buf, null, 0); } // Notice for updates: Please make sure this method isn't used anywhere -- public void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { -+ public synchronized void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { // Paper - synchronize - this.acquire(); - - try { -@@ -236,7 +236,7 @@ public class PalettedContainer implements PaletteResize { - - } - -- private static DataResult> read(IdMap idList, PalettedContainer.Strategy provider, PalettedContainer.DiscData serialized, T defaultValue, T @org.jetbrains.annotations.Nullable [] presetValues) { // Paper - Anti-Xray - Add preset values -+ private synchronized static DataResult> read(IdMap idList, PalettedContainer.Strategy provider, PalettedContainer.DiscData serialized, T defaultValue, T @org.jetbrains.annotations.Nullable [] presetValues) { // Paper - Anti-Xray - Add preset values // Paper - synchronize - List list = serialized.paletteEntries(); - int i = provider.size(); - int j = provider.calculateBitsForSerialization(idList, list.size()); -@@ -275,7 +275,7 @@ public class PalettedContainer implements PaletteResize { - return DataResult.success(new PalettedContainer<>(idList, provider, configuration, bitStorage, list, defaultValue, presetValues)); // Paper - Anti-Xray - Add preset values - } - -- private PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { -+ private synchronized PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { // Paper - synchronize - this.acquire(); - - PalettedContainer.DiscData var12; diff --git a/patches/server/0663-Synchronize-PalettedContainer-instead-of-ThreadingDe.patch b/patches/server/0663-Synchronize-PalettedContainer-instead-of-ThreadingDe.patch new file mode 100644 index 0000000000..8e8c207a92 --- /dev/null +++ b/patches/server/0663-Synchronize-PalettedContainer-instead-of-ThreadingDe.patch @@ -0,0 +1,91 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Fri, 29 May 2020 20:29:02 -0400 +Subject: [PATCH] Synchronize PalettedContainer instead of + ThreadingDetector/Semaphore + +Mojang has flaws in their logic about chunks being concurrently +wrote to. So we constantly see crashes around multiple threads writing. + +Additionally, java has optimized synchronization so well that its +in many times faster than trying to manage read write locks for low +contention situations. + +And this is extremely a low contention situation. + +diff --git a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java +index 45a969f97b26e328e34f3d576557999c32b954a2..277b75940d0424051919889b2d0045f313027234 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java ++++ b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java +@@ -32,14 +32,14 @@ public class PalettedContainer implements PaletteResize { + private final T @org.jetbrains.annotations.Nullable [] presetValues; // Paper - Anti-Xray - Add preset values + private volatile PalettedContainer.Data data; + private final PalettedContainer.Strategy strategy; +- private final ThreadingDetector threadingDetector = new ThreadingDetector("PalettedContainer"); ++ // private final ThreadingDetector threadingDetector = new ThreadingDetector("PalettedContainer"); // Paper - unused + + public void acquire() { +- this.threadingDetector.checkAndLock(); ++ // this.threadingDetector.checkAndLock(); // Paper - disable this - use proper synchronization + } + + public void release() { +- this.threadingDetector.checkAndUnlock(); ++ // this.threadingDetector.checkAndUnlock(); // Paper - disable this + } + + // Paper start - Anti-Xray - Add preset values +@@ -113,7 +113,7 @@ public class PalettedContainer implements PaletteResize { + } + + @Override +- public int onResize(int newBits, T object) { ++ public synchronized int onResize(int newBits, T object) { // Paper - synchronize + PalettedContainer.Data data = this.data; + + // Paper start - Anti-Xray - Add preset values +@@ -160,7 +160,7 @@ public class PalettedContainer implements PaletteResize { + return this.getAndSet(this.strategy.getIndex(x, y, z), value); + } + +- private T getAndSet(int index, T value) { ++ private synchronized T getAndSet(int index, T value) { // Paper - synchronize + int i = this.data.palette.idFor(value); + int j = this.data.storage.getAndSet(index, i); + return this.data.palette.valueFor(j); +@@ -177,7 +177,7 @@ public class PalettedContainer implements PaletteResize { + + } + +- private void set(int index, T value) { ++ private synchronized void set(int index, T value) { // Paper - synchronize + int i = this.data.palette.idFor(value); + this.data.storage.set(index, i); + } +@@ -200,7 +200,7 @@ public class PalettedContainer implements PaletteResize { + }); + } + +- public void read(FriendlyByteBuf buf) { ++ public synchronized void read(FriendlyByteBuf buf) { // Paper - synchronize + this.acquire(); + + try { +@@ -218,7 +218,7 @@ public class PalettedContainer implements PaletteResize { + + // Paper start - Anti-Xray - Add chunk packet info + @Deprecated public void write(FriendlyByteBuf buf) { this.write(buf, null, 0); } // Notice for updates: Please make sure this method isn't used anywhere +- public void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { ++ public synchronized void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { // Paper - synchronize + this.acquire(); + + try { +@@ -275,7 +275,7 @@ public class PalettedContainer implements PaletteResize { + return DataResult.success(new PalettedContainer<>(idList, provider, configuration, bitStorage, list, defaultValue, presetValues)); // Paper - Anti-Xray - Add preset values + } + +- private PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { ++ private synchronized PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { // Paper - synchronize + this.acquire(); + + PalettedContainer.DiscData var12; -- cgit v1.2.3