diff --git a/patches/server/Fix-deadlock-on-watchdog-crash.patch b/patches/server/Fix-deadlock-on-watchdog-crash.patch deleted file mode 100644 index d439715e9b..0000000000 --- a/patches/server/Fix-deadlock-on-watchdog-crash.patch +++ /dev/null @@ -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); diff --git a/patches/server/Fix-save-problems-on-shutdown.patch b/patches/server/Fix-save-problems-on-shutdown.patch new file mode 100644 index 0000000000..5487626aba --- /dev/null +++ b/patches/server/Fix-save-problems-on-shutdown.patch @@ -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; +