aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch')
-rw-r--r--patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch227
1 files changed, 227 insertions, 0 deletions
diff --git a/patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch b/patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch
new file mode 100644
index 0000000000..751923d583
--- /dev/null
+++ b/patches/unapplied/server/0591-Improve-and-expand-AsyncCatcher.patch
@@ -0,0 +1,227 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Wed, 25 Aug 2021 20:17:12 -0700
+Subject: [PATCH] Improve and expand AsyncCatcher
+
+Log when the async catcher is tripped
+ The chunk system can swallow the exception given it's all
+ built with completablefuture, so ensure it is at least printed.
+
+Add/move several async catchers
+
+Async catch modifications to critical entity state
+ These used to be here from Spigot, but were dropped with 1.17.
+ Now in 1.17, this state is _even more_ critical than it was before,
+ so these must exist to catch stupid plugins.
+
+Co-authored-by: Jake Potrebic <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 70b891bd018029eda8cda4fb9f919e77524dbc5e..a4abcbc69ccd023a936d02d359ba4c08198ed31e 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1597,6 +1597,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+
+ public void internalTeleport(PositionMoveRotation positionmoverotation, Set<Relative> set) {
++ org.spigotmc.AsyncCatcher.catchOp("teleport"); // Paper
+ // Paper start - Prevent teleporting dead entities
+ if (player.isRemoved()) {
+ LOGGER.info("Attempt to teleport removed player {} restricted", player.getScoreboardName());
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index f240a63f39affc048d1c13eb184f4b07c6c52d3e..a06a696fcec124d307eb84c1ee4f20ec928bfaec 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -1143,7 +1143,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ }
+
+ public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) {
+- org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot
++ // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API
+ if (this.isTickingEffects) {
+ this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
+ return true;
+diff --git a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
+index 4eb0b0969325f39a7ae65492cccd482515a50142..5aa74c00a61282830d82359eae2b114e2a48b6d9 100644
+--- a/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
++++ b/src/main/java/net/minecraft/world/level/entity/PersistentEntitySectionManager.java
+@@ -78,6 +78,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean addEntityUuid(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity add by UUID"); // Paper
+ if (!this.knownUuids.add(entity.getUUID())) {
+ PersistentEntitySectionManager.LOGGER.warn("UUID of added entity already exists: {}", entity);
+ return false;
+@@ -91,6 +92,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean addEntity(T entity, boolean existing) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity add"); // Paper
+ // Paper start - chunk system hooks
+ // I don't want to know why this is a generic type.
+ Entity entityCasted = (Entity)entity;
+@@ -144,19 +146,23 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ void startTicking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity start ticking"); // Paper
+ this.callbacks.onTickingStart(entity);
+ }
+
+ void stopTicking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity stop ticking"); // Paper
+ this.callbacks.onTickingEnd(entity);
+ }
+
+ void startTracking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity start tracking"); // Paper
+ this.visibleEntityStorage.add(entity);
+ this.callbacks.onTrackingStart(entity);
+ }
+
+ void stopTracking(T entity) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity stop tracking"); // Paper
+ this.callbacks.onTrackingEnd(entity);
+ this.visibleEntityStorage.remove(entity);
+ }
+@@ -168,6 +174,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void updateChunkStatus(ChunkPos chunkPos, Visibility trackingStatus) {
++ org.spigotmc.AsyncCatcher.catchOp("Update chunk status"); // Paper
+ long i = chunkPos.toLong();
+
+ if (trackingStatus == Visibility.HIDDEN) {
+@@ -212,6 +219,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void ensureChunkQueuedForLoad(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk save"); // Paper
+ PersistentEntitySectionManager.ChunkLoadStatus persistententitysectionmanager_b = (PersistentEntitySectionManager.ChunkLoadStatus) this.chunkLoadStatuses.get(chunkPos);
+
+ if (persistententitysectionmanager_b == PersistentEntitySectionManager.ChunkLoadStatus.FRESH) {
+@@ -256,6 +264,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private void requestChunkLoad(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk load request"); // Paper
+ this.chunkLoadStatuses.put(chunkPos, PersistentEntitySectionManager.ChunkLoadStatus.PENDING);
+ ChunkPos chunkcoordintpair = new ChunkPos(chunkPos);
+ CompletableFuture completablefuture = this.permanentStorage.loadEntities(chunkcoordintpair);
+@@ -269,6 +278,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private boolean processChunkUnload(long chunkPos) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk unload process"); // Paper
+ boolean flag = this.storeChunkSections(chunkPos, (entityaccess) -> {
+ entityaccess.getPassengersAndSelf().forEach(this::unloadEntity);
+ }, true); // CraftBukkit - add boolean for event call
+@@ -293,6 +303,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ private void processPendingLoads() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity chunk process pending loads"); // Paper
+ ChunkEntities<T> chunkentities; // CraftBukkit - decompile error
+
+ while ((chunkentities = (ChunkEntities) this.loadingInbox.poll()) != null) {
+@@ -309,6 +320,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void tick() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager tick"); // Paper
+ this.processPendingLoads();
+ this.processUnloads();
+ }
+@@ -329,6 +341,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void autoSave() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager autosave"); // Paper
+ this.getAllChunksToSave().forEach((java.util.function.LongConsumer) (i) -> { // CraftBukkit - decompile error
+ boolean flag = this.chunkVisibility.get(i) == Visibility.HIDDEN;
+
+@@ -343,6 +356,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ }
+
+ public void saveAll() {
++ org.spigotmc.AsyncCatcher.catchOp("Entity manager save"); // Paper
+ LongSet longset = this.getAllChunksToSave();
+
+ while (!longset.isEmpty()) {
+@@ -450,6 +464,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+ long i = SectionPos.asLong(blockposition);
+
+ if (i != this.currentSectionKey) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity move"); // Paper
+ Visibility visibility = this.currentSection.getStatus();
+
+ if (!this.currentSection.remove(this.entity)) {
+@@ -504,6 +519,7 @@ public class PersistentEntitySectionManager<T extends EntityAccess> implements A
+
+ @Override
+ public void onRemove(Entity.RemovalReason reason) {
++ org.spigotmc.AsyncCatcher.catchOp("Entity remove"); // Paper
+ if (!this.currentSection.remove(this.entity)) {
+ PersistentEntitySectionManager.LOGGER.warn("Entity {} wasn't found in section {} (destroying due to {})", new Object[]{this.entity, SectionPos.of(this.currentSectionKey), reason});
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+index be27fe25d1d1057da4734a8d9c2a92690a7eec3c..302812de273fe21d3ce7aedc325d9a739b69ef20 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+@@ -1755,6 +1755,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Location loc, Sound sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (loc == null || sound == null || category == null) return;
+
+ double x = loc.getX();
+@@ -1766,6 +1767,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Location loc, String sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (loc == null || sound == null || category == null) return;
+
+ double x = loc.getX();
+@@ -1798,6 +1800,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Entity entity, Sound sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return;
+
+ ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed);
+@@ -1818,6 +1821,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ @Override
+ public void playSound(Entity entity, String sound, org.bukkit.SoundCategory category, float volume, float pitch, long seed) {
++ org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper
+ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return;
+
+ ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(ResourceLocation.parse(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed);
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index 9870222cc1c46bcc37f9d3d44881606f2b9d038e..e148239d4930e5cbb000beed4de386f992f28d88 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -534,6 +534,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+
+ @Override
+ public boolean addPotionEffect(PotionEffect effect, boolean force) {
++ org.spigotmc.AsyncCatcher.catchOp("effect add"); // Paper
+ this.getHandle().addEffect(org.bukkit.craftbukkit.potion.CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
+ return true;
+ }
+diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
+index bbf0d9d9c44fe8d7add2f978994ec129420814c7..ef2598760458833021ef1bee92137f42c9fe591f 100644
+--- a/src/main/java/org/spigotmc/AsyncCatcher.java
++++ b/src/main/java/org/spigotmc/AsyncCatcher.java
+@@ -11,6 +11,7 @@ public class AsyncCatcher
+ {
+ if ( AsyncCatcher.enabled && Thread.currentThread() != MinecraftServer.getServer().serverThread )
+ {
++ MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable()); // Paper
+ throw new IllegalStateException( "Asynchronous " + reason + "!" );
+ }
+ }