aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0792-Do-not-overload-I-O-threads-with-chunk-data-while-fl.patch
blob: 4269df0d81037933ccf3947bb1a69fc3a65aa259 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 5ba598c136bca2be1badd41e9cfba39ee5f02994..7f73703cf9dc4ecdd049d6c72c0ecbdcca95a784 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -928,6 +928,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();
@@ -950,6 +960,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());