Skip to content

Commit 196271d

Browse files
committed
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).
1 parent 6564f70 commit 196271d

5 files changed

+59
-21
lines changed

patches/server/0878-Fix-deadlock-on-watchdog-crash.patch

Lines changed: 0 additions & 21 deletions
This file was deleted.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
3+
Date: Sat, 5 Mar 2022 17:12:52 -0800
4+
Subject: [PATCH] Fix save problems on shutdown
5+
6+
- Save level.dat first, in case the shutdown is killed later
7+
- Force run minecraftserver tasks and the chunk source tasks
8+
while waiting for the chunk system to empty, as there's simply
9+
too much trash that could prevent them from executing during
10+
the chunk source tick (i.e "time left in tick" logic).
11+
12+
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
13+
index 17e87875a95495940899b862eabf98b3d6a365da..e25c9a9ccab67a018c2e58e13b24089bc2ce538f 100644
14+
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
15+
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
16+
@@ -998,6 +998,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
17+
}
18+
}
19+
20+
+ // Paper start - let's be a little more intelligent around crashes
21+
+ // make sure level.dat saves
22+
+ for (ServerLevel level : this.getAllLevels()) {
23+
+ level.saveLevelDat();
24+
+ }
25+
+ // Paper end - let's be a little more intelligent around crashes
26+
+
27+
while (this.levels.values().stream().anyMatch((worldserver1) -> {
28+
return worldserver1.getChunkSource().chunkMap.hasWork();
29+
})) {
30+
@@ -1010,9 +1017,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
31+
worldserver.getChunkSource().tick(() -> {
32+
return true;
33+
}, false);
34+
+ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
35+
}
36+
37+
- this.waitUntilNextTick();
38+
+ while (this.pollTask()); // Paper - drain tasks
39+
}
40+
41+
this.saveAllChunks(false, true, false);
42+
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
43+
index b5b56d4549e97abbbe9e91d881b9bca8428f1eec..dce7452d58d6081f1a83baddafb1596ebd423d21 100644
44+
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
45+
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
46+
@@ -1258,7 +1258,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
47+
}
48+
49+
}
50+
+ // Paper start
51+
+ this.saveLevelDat();
52+
+ }
53+
54+
+ public void saveLevelDat() {
55+
+ this.saveLevelData();
56+
+ // Paper end
57+
// CraftBukkit start - moved from MinecraftServer.saveChunks
58+
ServerLevel worldserver1 = this;
59+

0 commit comments

Comments
 (0)