aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch')
-rw-r--r--patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch b/patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch
new file mode 100644
index 0000000000..b07c4721de
--- /dev/null
+++ b/patches/removed/1.19.2-legacy-chunksystem/0859-Fix-save-problems-on-shutdown.patch
@@ -0,0 +1,74 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Sat, 5 Mar 2022 17:12:52 -0800
+Subject: [PATCH] Fix save problems on shutdown
+
+- Save level.dat first, in case the shutdown is killed later
+- Force run minecraftserver tasks and the chunk source tasks
+ while waiting for the chunk system to empty, as there's simply
+ too much trash that could prevent them from executing during
+ the chunk source tick (i.e "time left in tick" logic).
+- Set forceTicks to true, so that player packets are always
+ processed so that the main process queue can be drained
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index df08b7afcf19ce694a87c25e8589c0c72521c5db..4d920031300a9801debc2eb39a4d3cb9d8fbb330 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -957,6 +957,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ }
+ }
+
++ // Paper start - let's be a little more intelligent around crashes
++ // make sure level.dat saves
++ for (ServerLevel level : this.getAllLevels()) {
++ level.saveLevelDat();
++ }
++ // Paper end - let's be a little more intelligent around crashes
++
+ while (this.levels.values().stream().anyMatch((worldserver1) -> {
+ return worldserver1.getChunkSource().chunkMap.hasWork();
+ })) {
+@@ -969,9 +976,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ worldserver.getChunkSource().tick(() -> {
+ return true;
+ }, false);
++ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
+ }
+
+- this.waitUntilNextTick();
++ this.forceTicks = true; // Paper
++ while (this.pollTask()); // Paper - drain tasks
+ }
+
+ this.saveAllChunks(false, true, false);
+@@ -1266,6 +1275,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ }
+
+ private boolean haveTime() {
++ // Paper start
++ if (this.forceTicks) {
++ return true;
++ }
++ // Paper end
+ // CraftBukkit start
+ if (isOversleep) return canOversleep();// Paper - because of our changes, this logic is broken
+ return this.forceTicks || this.runningTask() || Util.getMillis() < (this.mayHaveDelayedTasks ? this.delayedTasksMaxNextTickTime : this.nextTickTime);
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index e71ae32d9827d8a6fb8543abdba7627897ac9f2e..eceaa1f2ede1c068f9090d13bf9d3b3afaa08cc3 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -1284,7 +1284,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
+ }
+
+ }
++ // Paper start
++ this.saveLevelDat();
++ }
+
++ public void saveLevelDat() {
++ this.saveLevelData();
++ // Paper end
+ // CraftBukkit start - moved from MinecraftServer.saveChunks
+ ServerLevel worldserver1 = this;
+