geforkt von Mirrors/Paper
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).
Dieser Commit ist enthalten in:
Ursprung
4dcdc0e502
Commit
01b6bc66db
@ -1,21 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Fri, 4 Mar 2022 00:12:49 -0700
|
||||
Subject: [PATCH] Fix deadlock on watchdog crash
|
||||
|
||||
The watchdog thread sets MinecraftServer#forceTicks to true which will
|
||||
cause waitUntilNextTick to hang when the task queue is drained.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}, false);
|
||||
}
|
||||
|
||||
- this.waitUntilNextTick();
|
||||
+ this.managedBlock(() -> !this.canSleepForTickNoOversleep() || this.getPendingTasksCount() == 0); // Paper - based on waitUntilNextTick
|
||||
}
|
||||
|
||||
this.saveAllChunks(false, true, false);
|
59
patches/server/Fix-save-problems-on-shutdown.patch
Normale Datei
59
patches/server/Fix-save-problems-on-shutdown.patch
Normale Datei
@ -0,0 +1,59 @@
|
||||
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).
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -0,0 +0,0 @@ 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();
|
||||
})) {
|
||||
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
worldserver.getChunkSource().tick(() -> {
|
||||
return true;
|
||||
}, false);
|
||||
+ while (worldserver.getChunkSource().pollTask()); // Paper - drain tasks
|
||||
}
|
||||
|
||||
- this.waitUntilNextTick();
|
||||
+ while (this.pollTask()); // Paper - drain tasks
|
||||
}
|
||||
|
||||
this.saveAllChunks(false, true, false);
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -0,0 +0,0 @@ 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;
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren