Defensive copy chunk list to avoid "effective CME" - Fixes #313

Lighting operations apparently can load chunks, which will cause an NPE
in the same fashion you would trigger a CME during the chunk iteration.
This commit is contained in:
Aikar 2017-01-02 14:08:55 -05:00
parent bd7c76a1cf
commit 6d06f31c10

View file

@ -1,4 +1,4 @@
From 30eb1836f00bc0acb416356296137ec1881a4c09 Mon Sep 17 00:00:00 2001 From 77660fb147000a0103f9794ef134092519efb742 Mon Sep 17 00:00:00 2001
From: Byteflux <byte@byteflux.net> From: Byteflux <byte@byteflux.net>
Date: Wed, 2 Mar 2016 00:52:31 -0600 Date: Wed, 2 Mar 2016 00:52:31 -0600
Subject: [PATCH] Lighting Queue Subject: [PATCH] Lighting Queue
@ -6,7 +6,7 @@ Subject: [PATCH] Lighting Queue
This provides option to queue lighting updates to ensure they do not cause the server lag This provides option to queue lighting updates to ensure they do not cause the server lag
diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java
index e778911..f90f5bf 100644 index e7789117b..f90f5bf84 100644
--- a/src/main/java/co/aikar/timings/WorldTimingsHandler.java --- a/src/main/java/co/aikar/timings/WorldTimingsHandler.java
+++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java +++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java
@@ -50,6 +50,8 @@ public class WorldTimingsHandler { @@ -50,6 +50,8 @@ public class WorldTimingsHandler {
@ -27,7 +27,7 @@ index e778911..f90f5bf 100644
} }
} }
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 2767ffb..f7a0c18 100644 index 2767ffb78..f7a0c18a8 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -149,4 +149,10 @@ public class PaperWorldConfig { @@ -149,4 +149,10 @@ public class PaperWorldConfig {
@ -42,7 +42,7 @@ index 2767ffb..f7a0c18 100644
+ } + }
} }
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 1c0108e..b80f951 100644 index 1c0108ef1..b80f95159 100644
--- a/src/main/java/net/minecraft/server/Chunk.java --- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -33,6 +33,7 @@ public class Chunk { @@ -33,6 +33,7 @@ public class Chunk {
@ -85,7 +85,7 @@ index 1c0108e..b80f951 100644
TileEntity tileentity; TileEntity tileentity;
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index 17d39bb..df3ce72 100644 index 17d39bb0f..df3ce72e2 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -280,6 +280,7 @@ public class ChunkProviderServer implements IChunkProvider { @@ -280,6 +280,7 @@ public class ChunkProviderServer implements IChunkProvider {
@ -97,7 +97,7 @@ index 17d39bb..df3ce72 100644
// Update neighbor counts // Update neighbor counts
for (int x = -2; x < 3; x++) { for (int x = -2; x < 3; x++) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 127d11c..2e72b8c 100644 index 6a1c7b7f0..538745e7d 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -716,7 +716,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs @@ -716,7 +716,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs
@ -119,13 +119,15 @@ index 127d11c..2e72b8c 100644
diff --git a/src/main/java/net/minecraft/server/PaperLightingQueue.java b/src/main/java/net/minecraft/server/PaperLightingQueue.java diff --git a/src/main/java/net/minecraft/server/PaperLightingQueue.java b/src/main/java/net/minecraft/server/PaperLightingQueue.java
new file mode 100644 new file mode 100644
index 0000000..2350fe3 index 000000000..d8d3e1efd
--- /dev/null --- /dev/null
+++ b/src/main/java/net/minecraft/server/PaperLightingQueue.java +++ b/src/main/java/net/minecraft/server/PaperLightingQueue.java
@@ -0,0 +1,98 @@ @@ -0,0 +1,101 @@
+package net.minecraft.server; +package net.minecraft.server;
+ +
+import co.aikar.timings.Timing; +import co.aikar.timings.Timing;
+import it.unimi.dsi.fastutil.objects.ObjectCollection;
+
+import java.util.ArrayDeque; +import java.util.ArrayDeque;
+ +
+class PaperLightingQueue { +class PaperLightingQueue {
@ -145,7 +147,8 @@ index 0000000..2350fe3
+ continue; + continue;
+ } + }
+ +
+ for (Chunk chunk : ((WorldServer) world).getChunkProviderServer().chunks.values()) { + ObjectCollection<Chunk> loadedChunks = ((WorldServer) world).getChunkProviderServer().chunks.values();
+ for (Chunk chunk : loadedChunks.toArray(new Chunk[loadedChunks.size()])) {
+ if (chunk.lightingQueue.processQueue(startTime, maxTickTime)) { + if (chunk.lightingQueue.processQueue(startTime, maxTickTime)) {
+ break START; + break START;
+ } + }
@ -222,7 +225,7 @@ index 0000000..2350fe3
+ } + }
+} +}
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 804b994..8cb3a98 100644 index 1143b3e01..63a6a9855 100644
--- a/src/main/java/net/minecraft/server/World.java --- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java
@@ -387,7 +387,7 @@ public abstract class World implements IBlockAccess { @@ -387,7 +387,7 @@ public abstract class World implements IBlockAccess {
@ -235,5 +238,5 @@ index 804b994..8cb3a98 100644
} }
-- --
2.9.3 2.11.0