Skip to content

Commit 90788a5

Browse files
committed
clean up prepareTickingChunk diff
1 parent 12d89fe commit 90788a5

10 files changed

+42
-77
lines changed

patches/server/0403-Fix-Chunk-Post-Processing-deadlock-risk.patch

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ See: https://gist.github.com/aikar/dd22bbd2a3d78a2fd3d92e95e9f28dc6
88
as part of post processing a chunk, we can call ChunkConverter.
99

1010
ChunkConverter then kicks off major physics updates, and when blocks
11-
that have connections across chunk boundries occur, a recursive risk
11+
that have connections across chunk boundaries occur, a recursive risk
1212
can occur where A updates a block that triggers a physics request.
1313

1414
That physics request may trigger a chunk request, that then enqueues
@@ -21,42 +21,11 @@ will be unable to proceed.
2121
We delay post processing of Chunk.A() 1 "pass" by re stuffing it back into
2222
the executor so that the mailbox ChunkQueue is now considered empty.
2323

24-
This successfully fixed a reoccurring and highly reproduceable crash
24+
This successfully fixed a reoccurring and highly reproducible crash
2525
for heightmaps.
2626

27-
TODO FOR LEAF: 1.18.2 changed this
28-
29-
OLD
30-
31-
CompletableFuture<Either<LevelChunk, ChunkHolder.ChunkLoadingFailure>> completablefuture1 = completablefuture.thenApplyAsync((either) -> {
32-
return either.flatMap((list) -> {
33-
LevelChunk chunk = (LevelChunk) list.get(list.size() / 2);
34-
35-
chunk.postProcessGeneration();
36-
this.level.startTickingChunk(chunk);
37-
return Either.left(chunk);
38-
});
39-
}, (runnable) -> {
40-
this.mainThreadMailbox.tell(ChunkTaskPriorityQueueSorter.message(holder, () -> ChunkMap.this.chunkLoadConversionCallbackExecutor.execute(runnable))); // Paper - delay running Chunk post processing until outside of the sorter to prevent a deadlock scenario when post processing causes another chunk request.
41-
});
42-
43-
NEW
44-
45-
CompletableFuture<Either<LevelChunk, ChunkHolder.ChunkLoadingFailure>> completablefuture1 = completablefuture.thenApplyAsync((either) -> {
46-
return either.mapLeft((list) -> {
47-
return (LevelChunk) list.get(list.size() / 2);
48-
});
49-
}, (runnable) -> {
50-
this.mainThreadMailbox.tell(ChunkTaskPriorityQueueSorter.message(holder, () -> ChunkMap.this.chunkLoadConversionCallbackExecutor.execute(runnable))); // Paper - delay running Chunk post processing until outside of the sorter to prevent a deadlock scenario when post processing causes another chunk request.
51-
}).thenApplyAsync((either) -> {
52-
return either.ifLeft((chunk) -> {
53-
chunk.postProcessGeneration();
54-
this.level.startTickingChunk(chunk);
55-
});
56-
}, this.mainThreadExecutor);
57-
5827
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
59-
index 7e3f7b69fc7a608dd82b471d832cc401a77f0738..d251e07eec07f8f822af1f8713e46aebe54b4890 100644
28+
index 7e3f7b69fc7a608dd82b471d832cc401a77f0738..95feb9e316d4d1115c7dad5873979708f8d647d9 100644
6029
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
6130
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
6231
@@ -178,6 +178,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -67,30 +36,26 @@ index 7e3f7b69fc7a608dd82b471d832cc401a77f0738..d251e07eec07f8f822af1f8713e46aeb
6736
// Paper start - distance maps
6837
private final com.destroystokyo.paper.util.misc.PooledLinkedHashSets<ServerPlayer> pooledLinkedPlayerHashSets = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets<>();
6938

70-
@@ -1008,17 +1009,18 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
71-
return ChunkStatus.FULL;
39+
@@ -1009,16 +1010,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
7240
});
7341
CompletableFuture<Either<LevelChunk, ChunkHolder.ChunkLoadingFailure>> completablefuture1 = completablefuture.thenApplyAsync((either) -> {
74-
- return either.mapLeft((list) -> {
42+
return either.mapLeft((list) -> {
7543
- return (LevelChunk) list.get(list.size() / 2);
7644
- });
7745
- }, (runnable) -> {
7846
- this.mainThreadMailbox.tell(ChunkTaskPriorityQueueSorter.message(holder, runnable));
7947
- }).thenApplyAsync((either) -> {
8048
- return either.ifLeft((chunk) -> {
81-
+ // Paper start
82-
+ return either.flatMap((list) -> {
83-
+ LevelChunk chunk = (LevelChunk) list.get(list.size() / 2);
49+
+ // Paper start - revert 1.18.2 diff
50+
+ final LevelChunk chunk = (LevelChunk) list.get(list.size() / 2);
8451
chunk.postProcessGeneration();
8552
this.level.startTickingChunk(chunk);
86-
+ return Either.left(chunk);
87-
+
53+
+ return chunk;
8854
});
8955
- }, this.mainThreadExecutor);
9056
+ }, (runnable) -> {
91-
+ this.mainThreadMailbox.tell(ChunkTaskPriorityQueueSorter.message(holder, () -> ChunkMap.this.chunkLoadConversionCallbackExecutor.execute(runnable))); // Paper - delay running Chunk post processing until outside of the sorter to prevent a deadlock scenario when post processing causes another chunk request.
92-
+ });
93-
+ // Paper end
57+
+ this.mainThreadMailbox.tell(ChunkTaskPriorityQueueSorter.message(holder, () -> ChunkMap.this.chunkLoadConversionCallbackExecutor.execute(runnable))); // Paper - delay running Chunk post processing until outside of the sorter to prevent a deadlock scenario when post processing causes another chunk request.
58+
+ }); // Paper end - revert 1.18.2 diff
9459

9560
completablefuture1.thenAcceptAsync((either) -> {
9661
either.ifLeft((chunk) -> {

patches/server/0404-Fix-Longstanding-Broken-behavior-of-PlayerJoinEvent.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ receives a deterministic result, and should no longer require 1 tick
2828
delays anymore.
2929

3030
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
31-
index d251e07eec07f8f822af1f8713e46aebe54b4890..c11dac1aa504a9e82d883134caa9b4b689501ce1 100644
31+
index 95feb9e316d4d1115c7dad5873979708f8d647d9..da40ae8799de108b1d3913c3c27ed4f9273fb303 100644
3232
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
3333
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
34-
@@ -1624,6 +1624,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
34+
@@ -1622,6 +1622,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
3535
.printStackTrace();
3636
return;
3737
}

patches/server/0430-Reduce-allocation-of-Vec3D-by-entity-tracker.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ Subject: [PATCH] Reduce allocation of Vec3D by entity tracker
55

66

77
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
8-
index c11dac1aa504a9e82d883134caa9b4b689501ce1..d5e037385263cb094cbbf15823e38e81acafc7d7 100644
8+
index da40ae8799de108b1d3913c3c27ed4f9273fb303..7f8f242a746d542192bf59fc17e43d3544e5a442 100644
99
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
1010
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
11-
@@ -1902,9 +1902,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
11+
@@ -1900,9 +1900,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
1212
public void updatePlayer(ServerPlayer player) {
1313
org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
1414
if (player != this.entity) {

patches/server/0433-Optimize-anyPlayerCloseEnoughForSpawning-to-use-dist.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ index 674a6492e2eb10cfd29989643eedcea08b2d5218..dff475b327d6edaa4dcb9bc09029237f
4242

4343
// Paper start
4444
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
45-
index d5e037385263cb094cbbf15823e38e81acafc7d7..0959adc5ec64d1939fc212151d5e0df073ebc312 100644
45+
index 7f8f242a746d542192bf59fc17e43d3544e5a442..80018a94c12b7963c87b3960b71d88d8ac50ff09 100644
4646
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
4747
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
4848
@@ -181,11 +181,23 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -143,7 +143,7 @@ index d5e037385263cb094cbbf15823e38e81acafc7d7..0959adc5ec64d1939fc212151d5e0df0
143143
this.pendingUnloads.put(j, playerchunk);
144144
this.modified = true;
145145
this.scheduleUnload(j, playerchunk); // Paper - Move up - don't leak chunks
146-
@@ -1386,43 +1437,48 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
146+
@@ -1384,43 +1435,48 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
147147
return this.anyPlayerCloseEnoughForSpawning(pos, false);
148148
}
149149

patches/server/0434-Use-distance-map-to-optimise-entity-tracker.patch

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Subject: [PATCH] Use distance map to optimise entity tracker
66
Use the distance map to find candidate players for tracking.
77

88
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
9-
index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2f55952fd 100644
9+
index 80018a94c12b7963c87b3960b71d88d8ac50ff09..2ff9c1f1c41494c282b43eafeb719172f664414b 100644
1010
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
1111
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
1212
@@ -70,6 +70,7 @@ import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket;
@@ -126,7 +126,7 @@ index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2
126126
// Paper start - optimise ChunkMap#anyPlayerCloseEnoughForSpawning
127127
this.playerChunkTickRangeMap = new com.destroystokyo.paper.util.misc.PlayerAreaMap(this.pooledLinkedPlayerHashSets,
128128
(ServerPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ,
129-
@@ -1560,17 +1638,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
129+
@@ -1558,17 +1636,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
130130
}
131131

132132
public void move(ServerPlayer player) {
@@ -145,7 +145,7 @@ index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2
145145

146146
int i = SectionPos.blockToSectionCoord(player.getBlockX());
147147
int j = SectionPos.blockToSectionCoord(player.getBlockZ());
148-
@@ -1697,7 +1765,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
148+
@@ -1695,7 +1763,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
149149

150150
entity.tracker = playerchunkmap_entitytracker; // Paper - Fast access to tracker
151151
this.entityMap.put(entity.getId(), playerchunkmap_entitytracker);
@@ -154,7 +154,7 @@ index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2
154154
if (entity instanceof ServerPlayer) {
155155
ServerPlayer entityplayer = (ServerPlayer) entity;
156156

157-
@@ -1741,7 +1809,37 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
157+
@@ -1739,7 +1807,37 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
158158
entity.tracker = null; // Paper - We're no longer tracked
159159
}
160160

@@ -192,7 +192,7 @@ index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2
192192
List<ServerPlayer> list = Lists.newArrayList();
193193
List<ServerPlayer> list1 = this.level.players();
194194
ObjectIterator objectiterator = this.entityMap.values().iterator();
195-
@@ -1817,23 +1915,31 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
195+
@@ -1815,23 +1913,31 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
196196
DebugPackets.sendPoiPacketsForChunk(this.level, chunk.getPos());
197197
List<Entity> list = Lists.newArrayList();
198198
List<Entity> list1 = Lists.newArrayList();
@@ -236,7 +236,7 @@ index 0959adc5ec64d1939fc212151d5e0df073ebc312..1400975fd7debce564f289bf32d14dc2
236236

237237
Iterator iterator;
238238
Entity entity1;
239-
@@ -1909,6 +2015,42 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
239+
@@ -1907,6 +2013,42 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
240240
this.lastSectionPos = SectionPos.of(entity);
241241
}
242242

patches/server/0457-incremental-chunk-and-player-saving.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ index dff475b327d6edaa4dcb9bc09029237f8f659846..05d2790b80a6d2e1dc6b8d2375f783be
165165
for (int i = 0; i < this.futures.length(); ++i) {
166166
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = (CompletableFuture) this.futures.get(i);
167167
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
168-
index 1400975fd7debce564f289bf32d14dc2f55952fd..644ab527da5107c7cbfc037a143b1afe54efed7b 100644
168+
index 2ff9c1f1c41494c282b43eafeb719172f664414b..85a05c9e59ae1909e6d4ce7a2e45b16366a1b7dc 100644
169169
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
170170
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
171171
@@ -104,6 +104,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureMana
@@ -264,15 +264,15 @@ index 1400975fd7debce564f289bf32d14dc2f55952fd..644ab527da5107c7cbfc037a143b1afe
264264

265265
this.lightEngine.updateChunkStatus(ichunkaccess.getPos());
266266
this.lightEngine.tryScheduleUpdate();
267-
@@ -1248,6 +1302,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
267+
@@ -1246,6 +1300,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
268268
asyncSaveData, chunk);
269269

270270
chunk.setUnsaved(false);
271271
+ chunk.setLastSaved(this.level.getGameTime()); // Paper - track last saved time
272272
}
273273
// Paper end
274274

275-
@@ -1257,6 +1312,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
275+
@@ -1255,6 +1310,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
276276
if (!chunk.isUnsaved()) {
277277
return false;
278278
} else {

patches/server/0736-Fix-chunks-refusing-to-unload-at-low-TPS.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ chunk future to complete. We can simply schedule to the immediate
1010
executor to get this effect, rather than the main mailbox.
1111

1212
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
13-
index fcfb7df39457a539fea4c6b6af17d9d05e6ce812..74623b0f56e64afadb87cb6924159c0f9b79a56c 100644
13+
index edb35a483ae44073d560df1fe949aad60bf3d39d..fdfac353fe9cf8509a08b5157ed0762c3a12f3e3 100644
1414
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
1515
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
16-
@@ -1316,9 +1316,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
16+
@@ -1314,9 +1314,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
1717

1818
return chunk;
1919
});

patches/server/0750-Do-not-copy-visible-chunks.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ index b3516862d796c2d9fcc1c67a6073445403d73088..b61abf227a04b4565c2525e5f469db30
3535
List<ChunkHolder> allChunks = new ArrayList<>(visibleChunks.values());
3636
List<ServerPlayer> players = world.players;
3737
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
38-
index 7aa89874aeb53755fc75f56614568f31110af42a..50a89a1f485611249a1b393ae75b4ff6b9534402 100644
38+
index 9b2c5fe2389c6baa239de4f7b479d9ca273e59cf..c19395ab43b956787bf0e59ae242ff3a53d4ca46 100644
3939
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
4040
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
4141
@@ -123,9 +123,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -152,7 +152,7 @@ index 7aa89874aeb53755fc75f56614568f31110af42a..50a89a1f485611249a1b393ae75b4ff6
152152
this.modified = false;
153153
return true;
154154
}
155-
@@ -1481,7 +1493,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
155+
@@ -1479,7 +1491,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
156156

157157
this.viewDistance = j;
158158
this.distanceManager.updatePlayerTickets(this.viewDistance + 1);
@@ -161,7 +161,7 @@ index 7aa89874aeb53755fc75f56614568f31110af42a..50a89a1f485611249a1b393ae75b4ff6
161161

162162
while (objectiterator.hasNext()) {
163163
ChunkHolder playerchunk = (ChunkHolder) objectiterator.next();
164-
@@ -1524,7 +1536,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
164+
@@ -1522,7 +1534,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
165165
}
166166

167167
public int size() {
@@ -170,7 +170,7 @@ index 7aa89874aeb53755fc75f56614568f31110af42a..50a89a1f485611249a1b393ae75b4ff6
170170
}
171171

172172
public DistanceManager getDistanceManager() {
173-
@@ -1532,13 +1544,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
173+
@@ -1530,13 +1542,13 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
174174
}
175175

176176
protected Iterable<ChunkHolder> getChunks() {

patches/server/0767-Oprimise-map-impl-for-tracked-players.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Reference2BooleanOpenHashMap is going to have
77
better lookups than HashMap.
88

99
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
10-
index 50a89a1f485611249a1b393ae75b4ff6b9534402..01cb03ab0839aa7e2b9c54226b557306e4115348 100644
10+
index c19395ab43b956787bf0e59ae242ff3a53d4ca46..af9b1fe737ab430861b4d0de33eec1325964c3a5 100644
1111
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
1212
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
1313
@@ -110,6 +110,7 @@ import org.apache.commons.lang3.mutable.MutableObject;
@@ -18,7 +18,7 @@ index 50a89a1f485611249a1b393ae75b4ff6b9534402..01cb03ab0839aa7e2b9c54226b557306
1818

1919
public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider {
2020

21-
@@ -2171,7 +2172,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
21+
@@ -2169,7 +2170,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
2222
final Entity entity;
2323
private final int range;
2424
SectionPos lastSectionPos;

0 commit comments

Comments
 (0)