diff options
author | Aikar <[email protected]> | 2020-08-06 22:49:50 -0400 |
---|---|---|
committer | Daniel Ennis <[email protected]> | 2020-08-06 22:55:24 -0400 |
commit | adadf16548ad220bf178596f8b9bc0a0ffeaef19 (patch) | |
tree | 35cb9d5d115d5c46287914614d5512ed0864aca7 /Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch | |
parent | 6f66fa57143ad9a48a8f812cf13acf62393aa56c (diff) | |
download | Paper-adadf16548ad220bf178596f8b9bc0a0ffeaef19.tar.gz Paper-adadf16548ad220bf178596f8b9bc0a0ffeaef19.zip |
Drop syncPosition on teleportation patch
I'm not sure it was really helping, and now suspecting it might be causing issues
Movement sucks
Diffstat (limited to 'Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch')
-rw-r--r-- | Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch b/Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch new file mode 100644 index 0000000000..99aea0ca9c --- /dev/null +++ b/Spigot-Server-Patches/0479-Stop-copy-on-write-operations-for-updating-light-dat.patch @@ -0,0 +1,319 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf <[email protected]> +Date: Mon, 27 Apr 2020 04:05:38 -0700 +Subject: [PATCH] Stop copy-on-write operations for updating light data + +Causes huge memory allocations + gc issues + +diff --git a/src/main/java/net/minecraft/server/LightEngineStorage.java b/src/main/java/net/minecraft/server/LightEngineStorage.java +index 916d38cebcbe912153d54a21acbf60bc26db7401..6c7c4e75670a7e08ba10c0231a2510bf985dab6b 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorage.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorage.java +@@ -19,8 +19,8 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e + protected final LongSet b = new LongOpenHashSet(); + protected final LongSet c = new LongOpenHashSet(); + protected final LongSet d = new LongOpenHashSet(); +- protected volatile M e; +- protected final M f; ++ protected volatile M e_visible; protected final Object visibleUpdateLock = new Object(); // Paper - diff on change, should be "visible" - force compile fail on usage change ++ protected final M f; // Paper - diff on change, should be "updating" + protected final LongSet g = new LongOpenHashSet(); + protected final LongSet h = new LongOpenHashSet(); + protected final Long2ObjectMap<NibbleArray> i = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap()); +@@ -34,8 +34,8 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e + this.l = enumskyblock; + this.m = ilightaccess; + this.f = m0; +- this.e = m0.b(); +- this.e.d(); ++ this.e_visible = m0.b(); // Paper - avoid copying light data ++ this.e_visible.d(); // Paper - avoid copying light data + } + + protected boolean g(long i) { +@@ -44,7 +44,15 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e + + @Nullable + protected NibbleArray a(long i, boolean flag) { +- return this.a(flag ? this.f : this.e, i); ++ // Paper start - avoid copying light data ++ if (flag) { ++ return this.a(this.f, i); ++ } else { ++ synchronized (this.visibleUpdateLock) { ++ return this.a(this.e_visible, i); ++ } ++ } ++ // Paper end - avoid copying light data + } + + @Nullable +@@ -357,10 +365,12 @@ public abstract class LightEngineStorage<M extends LightEngineStorageArray<M>> e + + protected void e() { + if (!this.g.isEmpty()) { ++ synchronized (this.visibleUpdateLock) { // Paper - avoid copying light data + M m0 = this.f.b(); + + m0.d(); +- this.e = m0; ++ this.e_visible = m0; // Paper - avoid copying light data ++ } // Paper - avoid copying light data + this.g.clear(); + } + +diff --git a/src/main/java/net/minecraft/server/LightEngineStorageArray.java b/src/main/java/net/minecraft/server/LightEngineStorageArray.java +index b978723a66d001f70325df0c7521025e079d7cfa..53199595da71a25710bd1ff8ee2868ee63edc0e1 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorageArray.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorageArray.java +@@ -8,10 +8,23 @@ public abstract class LightEngineStorageArray<M extends LightEngineStorageArray< + private final long[] b = new long[2]; + private final NibbleArray[] c = new NibbleArray[2]; + private boolean d; +- protected final Long2ObjectOpenHashMap<NibbleArray> a; +- +- protected LightEngineStorageArray(Long2ObjectOpenHashMap<NibbleArray> long2objectopenhashmap) { +- this.a = long2objectopenhashmap; ++ protected final com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> data; // Paper - avoid copying light data ++ protected final boolean isVisible; // Paper - avoid copying light data ++ java.util.function.Function<Long, NibbleArray> lookup; // Paper - faster branchless lookup ++ ++ // Paper start - avoid copying light data ++ protected LightEngineStorageArray(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> data, boolean isVisible) { ++ if (isVisible) { ++ data.performUpdatesLockMap(); ++ } ++ this.data = data; ++ this.isVisible = isVisible; ++ if (isVisible) { ++ lookup = data::getVisibleAsync; ++ } else { ++ lookup = data::getUpdating; ++ } ++ // Paper end - avoid copying light data + this.c(); + this.d = true; + } +@@ -19,16 +32,17 @@ public abstract class LightEngineStorageArray<M extends LightEngineStorageArray< + public abstract M b(); + + public void a(long i) { +- this.a.put(i, ((NibbleArray) this.a.get(i)).b()); ++ if (this.isVisible) { throw new IllegalStateException("writing to visible data"); } // Paper - avoid copying light data ++ this.data.queueUpdate(i, ((NibbleArray) this.data.getUpdating(i)).b()); // Paper - avoid copying light data + this.c(); + } + + public boolean b(long i) { +- return this.a.containsKey(i); ++ return lookup.apply(i) != null; // Paper - avoid copying light data + } + + @Nullable +- public NibbleArray c(long i) { ++ public final NibbleArray c(long i) { // Paper - final + if (this.d) { + for (int j = 0; j < 2; ++j) { + if (i == this.b[j]) { +@@ -37,7 +51,7 @@ public abstract class LightEngineStorageArray<M extends LightEngineStorageArray< + } + } + +- NibbleArray nibblearray = (NibbleArray) this.a.get(i); ++ NibbleArray nibblearray = lookup.apply(i); // Paper - avoid copying light data + + if (nibblearray == null) { + return null; +@@ -58,11 +72,13 @@ public abstract class LightEngineStorageArray<M extends LightEngineStorageArray< + + @Nullable + public NibbleArray d(long i) { +- return (NibbleArray) this.a.remove(i); ++ if (this.isVisible) { throw new IllegalStateException("writing to visible data"); } // Paper - avoid copying light data ++ return (NibbleArray) this.data.queueRemove(i); // Paper - avoid copying light data + } + + public void a(long i, NibbleArray nibblearray) { +- this.a.put(i, nibblearray); ++ if (this.isVisible) { throw new IllegalStateException("writing to visible data"); } // Paper - avoid copying light data ++ this.data.queueUpdate(i, nibblearray); // Paper - avoid copying light data + } + + public void c() { +@@ -70,7 +86,6 @@ public abstract class LightEngineStorageArray<M extends LightEngineStorageArray< + this.b[i] = Long.MAX_VALUE; + this.c[i] = null; + } +- + } + + public void d() { +diff --git a/src/main/java/net/minecraft/server/LightEngineStorageBlock.java b/src/main/java/net/minecraft/server/LightEngineStorageBlock.java +index 0f7f4744d9f9e5174fb38ccc72248397a4b064ea..292d8c742d3be41ba8ad7fb7f1251dc7f790b62b 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorageBlock.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorageBlock.java +@@ -5,7 +5,7 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; + public class LightEngineStorageBlock extends LightEngineStorage<LightEngineStorageBlock.a> { + + protected LightEngineStorageBlock(ILightAccess ilightaccess) { +- super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new Long2ObjectOpenHashMap())); ++ super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<>(), false)); // Paper - avoid copying light data + } + + @Override +@@ -18,13 +18,13 @@ public class LightEngineStorageBlock extends LightEngineStorage<LightEngineStora + + public static final class a extends LightEngineStorageArray<LightEngineStorageBlock.a> { + +- public a(Long2ObjectOpenHashMap<NibbleArray> long2objectopenhashmap) { +- super(long2objectopenhashmap); ++ public a(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> long2objectopenhashmap, boolean isVisible) { // Paper - avoid copying light data ++ super(long2objectopenhashmap, isVisible); // Paper - avoid copying light data + } + + @Override + public LightEngineStorageBlock.a b() { +- return new LightEngineStorageBlock.a(this.a.clone()); ++ return new a(this.data, true); // Paper - avoid copying light data + } + } + } +diff --git a/src/main/java/net/minecraft/server/LightEngineStorageSky.java b/src/main/java/net/minecraft/server/LightEngineStorageSky.java +index 75d9065b32731dc635d9d09c48fb9643172381a9..7cec18fcfc311d20beca244c0affe5d6c1849e46 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorageSky.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorageSky.java +@@ -17,15 +17,16 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + private volatile boolean p; + + protected LightEngineStorageSky(ILightAccess ilightaccess) { +- super(EnumSkyBlock.SKY, ilightaccess, new LightEngineStorageSky.a(new Long2ObjectOpenHashMap(), new Long2IntOpenHashMap(), Integer.MAX_VALUE)); ++ super(EnumSkyBlock.SKY, ilightaccess, new LightEngineStorageSky.a(new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<>(), new com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int(), Integer.MAX_VALUE, false)); // Paper - avoid copying light data + } + + @Override + protected int d(long i) { + long j = SectionPosition.e(i); + int k = SectionPosition.c(j); +- LightEngineStorageSky.a lightenginestoragesky_a = (LightEngineStorageSky.a) this.e; +- int l = lightenginestoragesky_a.c.get(SectionPosition.f(j)); ++ synchronized (this.visibleUpdateLock) { // Paper - avoid copying light data ++ LightEngineStorageSky.a lightenginestoragesky_a = (LightEngineStorageSky.a) this.e_visible; // Paper - avoid copying light data - must be after lock acquire ++ int l = lightenginestoragesky_a.otherData.getVisibleAsync(SectionPosition.f(j)); // Paper - avoid copying light data + + if (l != lightenginestoragesky_a.b && k < l) { + NibbleArray nibblearray = this.a(lightenginestoragesky_a, j); // Paper - decompile fix +@@ -46,6 +47,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + } else { + return 15; + } ++ } // Paper - avoid copying light data + } + + @Override +@@ -54,14 +56,14 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + + if (((LightEngineStorageSky.a) this.f).b > j) { + ((LightEngineStorageSky.a) this.f).b = j; +- ((LightEngineStorageSky.a) this.f).c.defaultReturnValue(((LightEngineStorageSky.a) this.f).b); ++ ((LightEngineStorageSky.a) this.f).otherData.queueDefaultReturnValue(((LightEngineStorageSky.a) this.f).b); // Paper - avoid copying light data + } + + long k = SectionPosition.f(i); +- int l = ((LightEngineStorageSky.a) this.f).c.get(k); ++ int l = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(k); // Paper - avoid copying light data + + if (l < j + 1) { +- ((LightEngineStorageSky.a) this.f).c.put(k, j + 1); ++ ((LightEngineStorageSky.a) this.f).otherData.queueUpdate(k, j + 1); // Paper - avoid copying light data + if (this.o.contains(k)) { + this.q(i); + if (l > ((LightEngineStorageSky.a) this.f).b) { +@@ -101,7 +103,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + + int k = SectionPosition.c(i); + +- if (((LightEngineStorageSky.a) this.f).c.get(j) == k + 1) { ++ if (((LightEngineStorageSky.a) this.f).otherData.getUpdating(j) == k + 1) { // Paper - avoid copying light data + long l; + + for (l = i; !this.g(l) && this.a(k); l = SectionPosition.a(l, EnumDirection.DOWN)) { +@@ -109,12 +111,12 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + } + + if (this.g(l)) { +- ((LightEngineStorageSky.a) this.f).c.put(j, k + 1); ++ ((LightEngineStorageSky.a) this.f).otherData.queueUpdate(j, k + 1); // Paper - avoid copying light data + if (flag) { + this.q(l); + } + } else { +- ((LightEngineStorageSky.a) this.f).c.remove(j); ++ ((LightEngineStorageSky.a) this.f).otherData.queueRemove(j); // Paper - avoid copying light data + } + } + +@@ -128,7 +130,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + protected void b(long i, boolean flag) { + this.d(); + if (flag && this.o.add(i)) { +- int j = ((LightEngineStorageSky.a) this.f).c.get(i); ++ int j = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(i); // Paper - avoid copying light data + + if (j != ((LightEngineStorageSky.a) this.f).b) { + long k = SectionPosition.b(SectionPosition.b(i), j - 1, SectionPosition.d(i)); +@@ -155,7 +157,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + return nibblearray; + } else { + long j = SectionPosition.a(i, EnumDirection.UP); +- int k = ((LightEngineStorageSky.a) this.f).c.get(SectionPosition.f(i)); ++ int k = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(SectionPosition.f(i)); // Paper - avoid copying light data + + if (k != ((LightEngineStorageSky.a) this.f).b && SectionPosition.c(j) < k) { + NibbleArray nibblearray1; +@@ -298,7 +300,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + if (!this.o.contains(l)) { + return false; + } else { +- int i1 = ((LightEngineStorageSky.a) this.f).c.get(l); ++ int i1 = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(l); // Paper - avoid copying light data + + return SectionPosition.c(i1) == j + 16; + } +@@ -307,7 +309,7 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + + protected boolean n(long i) { + long j = SectionPosition.f(i); +- int k = ((LightEngineStorageSky.a) this.f).c.get(j); ++ int k = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(j); // Paper - avoid copying light data + + return k == ((LightEngineStorageSky.a) this.f).b || SectionPosition.c(i) >= k; + } +@@ -321,18 +323,21 @@ public class LightEngineStorageSky extends LightEngineStorage<LightEngineStorage + public static final class a extends LightEngineStorageArray<LightEngineStorageSky.a> { + + private int b; +- private final Long2IntOpenHashMap c; +- +- public a(Long2ObjectOpenHashMap<NibbleArray> long2objectopenhashmap, Long2IntOpenHashMap long2intopenhashmap, int i) { +- super(long2objectopenhashmap); +- this.c = long2intopenhashmap; +- long2intopenhashmap.defaultReturnValue(i); ++ private final com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int otherData; // Paper - avoid copying light data ++ ++ // Paper start - avoid copying light data ++ public a(com.destroystokyo.paper.util.map.QueuedChangesMapLong2Object<NibbleArray> data, com.destroystokyo.paper.util.map.QueuedChangesMapLong2Int otherData, int i, boolean isVisible) { ++ super(data, isVisible); ++ this.otherData = otherData; ++ otherData.queueDefaultReturnValue(i); ++ // Paper end - avoid copying light data + this.b = i; + } + + @Override + public LightEngineStorageSky.a b() { +- return new LightEngineStorageSky.a(this.a.clone(), this.c.clone(), this.b); ++ this.otherData.performUpdatesLockMap(); // Paper - avoid copying light data ++ return new LightEngineStorageSky.a(this.data, this.otherData, this.b, true); // Paper - avoid copying light data + } + } + } |