07548192b1
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: cc7edd6bc SPIGOT-7051: Worldgen API does not run vanilla noise generation when shouldGenerateNoise is true
42 lines
2.3 KiB
Diff
42 lines
2.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sat, 16 Oct 2021 01:36:00 -0700
|
|
Subject: [PATCH] Do not overload I/O threads with chunk data while flush
|
|
saving
|
|
|
|
If the chunk count is high, then the memory used by the
|
|
chunks adds up and could cause problems. By flushing
|
|
every so many chunks, the server will not become
|
|
stressed for memory. It will also not increase the total
|
|
time to save, as flush saving performs a full flush at
|
|
the end anyways.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
index 6671caad52c3a5943334e613b836026c416183b4..595d414f633e3183147fb4b137a149e948dab332 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
@@ -949,6 +949,16 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
// Paper end
|
|
|
|
protected void saveAllChunks(boolean flush) {
|
|
+ // Paper start - do not overload I/O threads with too much work when saving
|
|
+ int[] saved = new int[1];
|
|
+ int maxAsyncSaves = 50;
|
|
+ Runnable onChunkSave = () -> {
|
|
+ if (++saved[0] >= maxAsyncSaves) {
|
|
+ saved[0] = 0;
|
|
+ com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE.flush();
|
|
+ }
|
|
+ };
|
|
+ // Paper end - do not overload I/O threads with too much work when saving
|
|
if (flush) {
|
|
List<ChunkHolder> list = (List) this.updatingChunks.getVisibleValuesCopy().stream().filter(ChunkHolder::wasAccessibleSinceLastSave).peek(ChunkHolder::refreshAccessibility).collect(Collectors.toList()); // Paper
|
|
MutableBoolean mutableboolean = new MutableBoolean();
|
|
@@ -971,6 +981,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
}).filter((ichunkaccess) -> {
|
|
return ichunkaccess instanceof ImposterProtoChunk || ichunkaccess instanceof LevelChunk;
|
|
}).filter(this::save).forEach((ichunkaccess) -> {
|
|
+ onChunkSave.run(); // Paper - do not overload I/O threads with too much work when saving
|
|
mutableboolean.setTrue();
|
|
});
|
|
} while (mutableboolean.isTrue());
|