aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch')
-rw-r--r--patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch68
1 files changed, 68 insertions, 0 deletions
diff --git a/patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch b/patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch
new file mode 100644
index 0000000000..33087ceabe
--- /dev/null
+++ b/patches/removed/1.19.2-legacy-chunksystem/0763-Do-not-process-entity-loads-in-CraftChunk-getEntitie.patch
@@ -0,0 +1,68 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shane Freeder <[email protected]>
+Date: Fri, 3 Sep 2021 15:50:25 +0100
+Subject: [PATCH] Do not process entity loads in CraftChunk#getEntities
+
+This re-introduces the issue behind #5872 but fixes #6543
+The logic here is generally flawed however somewhat of a nuance,
+upstream uses managedBlock which is basically needed to process
+the posted entity adds, but, has the side-effect of processing any
+chunk loads which has the naunce of stacking up and either causing a
+massive performance hit, or can potentially lead the server to crash.
+
+This issue is particularly noticable on paper due to the cumulative efforts
+to drastically improve chunk loading speeds which means that there is much more
+of a chance that we're about to eat a dirtload of chunk load callbacks, thus
+making this issue much more of an issue
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+index 2224b9cfbc3be59037ef49ce278989ea3a710bb5..0b9312dc5ee43d2d450dc6e9f07a9ac0320955ca 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+@@ -130,46 +130,6 @@ public class CraftChunk implements Chunk {
+ this.getWorld().getChunkAt(x, z); // Transient load for this tick
+ }
+
+- PersistentEntitySectionManager<net.minecraft.world.entity.Entity> entityManager = this.getCraftWorld().getHandle().entityManager;
+- long pair = ChunkPos.asLong(x, z);
+-
+- if (entityManager.areEntitiesLoaded(pair)) {
+- return getCraftWorld().getHandle().getChunkEntities(this.x, this.z); // Paper - optimise this
+- }
+-
+- entityManager.ensureChunkQueuedForLoad(pair); // Start entity loading
+-
+- // SPIGOT-6772: Use entity mailbox and re-schedule entities if they get unloaded
+- ProcessorMailbox<Runnable> mailbox = ((EntityStorage) entityManager.permanentStorage).entityDeserializerQueue;
+- BooleanSupplier supplier = () -> {
+- // only execute inbox if our entities are not present
+- if (entityManager.areEntitiesLoaded(pair)) {
+- return true;
+- }
+-
+- if (!entityManager.isPending(pair)) {
+- // Our entities got unloaded, this should normally not happen.
+- entityManager.ensureChunkQueuedForLoad(pair); // Re-start entity loading
+- }
+-
+- // tick loading inbox, which loads the created entities to the world
+- // (if present)
+- entityManager.tick();
+- // check if our entities are loaded
+- return entityManager.areEntitiesLoaded(pair);
+- };
+-
+- // now we wait until the entities are loaded,
+- // the converting from NBT to entity object is done on the main Thread which is why we wait
+- while (!supplier.getAsBoolean()) {
+- if (mailbox.size() != 0) {
+- mailbox.run();
+- } else {
+- Thread.yield();
+- LockSupport.parkNanos("waiting for entity loading", 100000L);
+- }
+- }
+-
+ return getCraftWorld().getHandle().getChunkEntities(this.x, this.z); // Paper - optimise this
+ }
+