2022-03-06 02:29:47 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
|
|
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).
|
2022-03-06 02:36:57 +01:00
|
|
|
- Set forceTicks to true, so that player packets are always
|
|
|
|
processed so that the main process queue can be drained
|
2022-03-06 02:29:47 +01:00
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2022-03-13 08:47:54 +01:00
|
|
|
index edceca7fe37c9b10a80829182c0b3af82b3d163d..32099b8ca18f298812e15285a8e04039eca1375d 100644
|
2022-03-06 02:29:47 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2022-03-13 08:47:54 +01:00
|
|
|
@@ -996,6 +996,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2022-03-06 02:29:47 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // 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();
|
|
|
|
})) {
|
2022-03-13 08:47:54 +01:00
|
|
|
@@ -1008,9 +1015,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2022-03-06 02:29:47 +01:00
|
|
|
worldserver.getChunkSource().tick(() -> {
|
|
|
|
return true;
|
|
|
|
}, false);
|
|
|
|
+ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
|
|
|
|
}
|
|
|
|
|
|
|
|
- this.waitUntilNextTick();
|
2022-03-06 02:36:57 +01:00
|
|
|
+ this.forceTicks = true; // Paper
|
2022-03-06 02:29:47 +01:00
|
|
|
+ while (this.pollTask()); // Paper - drain tasks
|
|
|
|
}
|
|
|
|
|
|
|
|
this.saveAllChunks(false, true, false);
|
2022-03-13 08:47:54 +01:00
|
|
|
@@ -1306,6 +1315,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
2022-03-06 02:36:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2022-03-06 02:29:47 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
2022-03-11 21:13:46 +01:00
|
|
|
index 5181f061c73c120c8e9ef30b7da1945c8f57b418..9696bb71921824dc8a0b25a44b803db03296f4fc 100644
|
2022-03-06 02:29:47 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
|
|
@@ -1258,7 +1258,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;
|
|
|
|
|