2022-09-26 10:02:51 +02:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Sun, 9 Jun 2019 03:53:22 +0100
2024-07-15 20:57:56 +02:00
Subject: [PATCH] Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
2024-07-15 20:57:56 +02:00
index 54e581db732c3a104142a2bbc228ecbe16aec0fc..c163745f878d484fdb2b8630e2167c7a03f45880 100644
2022-09-26 10:02:51 +02:00
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2024-07-15 20:57:56 +02:00
@@ -992,7 +992,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2022-09-26 10:02:51 +02:00
try {
this.isSaving = true;
- this.getPlayerList().saveAll();
2024-01-20 23:13:41 +01:00
+ this.getPlayerList().saveAll(); // Paper - Incremental chunk and player saving; diff on change
2022-09-26 10:02:51 +02:00
flag3 = this.saveAllChunks(suppressLogs, flush, force);
} finally {
this.isSaving = false;
2024-07-15 20:57:56 +02:00
@@ -1606,16 +1606,28 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2022-09-26 10:02:51 +02:00
}
2023-12-06 04:00:14 +01:00
--this.ticksUntilAutosave;
- // CraftBukkit start
- if (this.autosavePeriod > 0 && this.ticksUntilAutosave <= 0) {
- this.ticksUntilAutosave = this.autosavePeriod;
- // CraftBukkit end
2022-09-26 10:02:51 +02:00
- MinecraftServer.LOGGER.debug("Autosave started");
- this.profiler.push("save");
- this.saveEverything(true, false, false);
- this.profiler.pop();
- MinecraftServer.LOGGER.debug("Autosave finished");
2024-01-20 23:13:41 +01:00
+ // Paper start - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
+ int playerSaveInterval = io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.rate;
+ if (playerSaveInterval < 0) {
+ playerSaveInterval = autosavePeriod;
2024-07-15 20:57:56 +02:00
+ }
2022-09-26 10:02:51 +02:00
+ this.profiler.push("save");
+ final boolean fullSave = autosavePeriod > 0 && this.tickCount % autosavePeriod == 0;
+ try {
+ this.isSaving = true;
+ if (playerSaveInterval > 0) {
+ this.playerList.saveAll(playerSaveInterval);
+ }
+ for (ServerLevel level : this.getAllLevels()) {
+ if (level.paperConfig().chunks.autoSaveInterval.value() > 0) {
+ level.saveIncrementally(fullSave);
+ }
+ }
+ } finally {
+ this.isSaving = false;
2024-07-15 20:57:56 +02:00
}
2022-09-26 10:02:51 +02:00
+ this.profiler.pop();
2024-01-20 23:13:41 +01:00
+ // Paper end - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
io.papermc.paper.util.CachedLists.reset(); // Paper
// Paper start - move executeAll() into full server tick timing
try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
2024-07-15 20:57:56 +02:00
index 9b463cd43bcf763faab04012137695a575f16729..b3ca52c0a1c4c9c2f4d86b83ad2d6308e3ba9e7c 100644
2022-09-26 10:02:51 +02:00
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
2024-07-15 20:57:56 +02:00
@@ -1339,6 +1339,35 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf.
2022-09-26 10:02:51 +02:00
return !this.server.isUnderSpawnProtection(this, pos, player) && this.getWorldBorder().isWithinBounds(pos);
}
2024-01-20 23:13:41 +01:00
+ // Paper start - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
+ public void saveIncrementally(boolean doFull) {
+ ServerChunkCache chunkproviderserver = this.getChunkSource();
+
+ if (doFull) {
+ org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld()));
+ }
+
+ try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) {
+ if (doFull) {
2024-07-15 20:57:56 +02:00
+ this.saveLevelData(true);
2022-09-26 10:02:51 +02:00
+ }
+
2024-07-15 20:57:56 +02:00
+ // chunk autosave is already called by the ChunkSystem during unload processing (ChunkMap#processUnloads)
2022-09-26 10:02:51 +02:00
+
+ // Copied from save()
+ // CraftBukkit start - moved from MinecraftServer.saveChunks
+ if (doFull) { // Paper
+ ServerLevel worldserver1 = this;
+
+ this.serverLevelData.setWorldBorder(worldserver1.getWorldBorder().createSettings());
2024-04-26 07:25:02 +02:00
+ this.serverLevelData.setCustomBossEvents(this.server.getCustomBossEvents().save(this.registryAccess()));
2022-12-07 22:05:01 +01:00
+ this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData());
2022-09-26 10:02:51 +02:00
+ }
+ // CraftBukkit end
+ }
+ }
2024-01-20 23:13:41 +01:00
+ // Paper end - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
+
public void save(@Nullable ProgressListener progressListener, boolean flush, boolean savingDisabled) {
2024-06-15 14:12:22 +02:00
// Paper start - add close param
2024-01-24 22:13:08 +01:00
this.save(progressListener, flush, savingDisabled, false);
2022-09-26 10:02:51 +02:00
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
2024-07-15 20:57:56 +02:00
index 9d1e68c09fa7093cf0f6fa636f90cb15a44cbb38..71882332ee61023d656a6de3955ca34fcef1f536 100644
2022-09-26 10:02:51 +02:00
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
2024-06-15 14:12:22 +02:00
@@ -202,6 +202,7 @@ import org.bukkit.inventory.MainHand;
public class ServerPlayer extends net.minecraft.world.entity.player.Player implements ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer { // Paper - rewrite chunk system
2022-09-26 10:02:51 +02:00
private static final Logger LOGGER = LogUtils.getLogger();
2024-01-20 23:13:41 +01:00
+ public long lastSave = MinecraftServer.currentTick; // Paper - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32;
private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10;
2023-12-06 04:00:14 +01:00
private static final int FLY_STAT_RECORDING_SPEED = 25;
2022-09-26 10:02:51 +02:00
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
2024-07-15 20:57:56 +02:00
index 5f20606cc2c79ad9a4c4d4d6c9e6a2a31a88b282..dfcaff15a145bf29e8a538d853bb04aec8c36179 100644
2022-09-26 10:02:51 +02:00
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
2024-06-15 14:12:22 +02:00
@@ -569,6 +569,7 @@ public abstract class PlayerList {
2022-12-19 11:46:55 +01:00
2022-09-26 10:02:51 +02:00
protected void save(ServerPlayer player) {
if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit
2024-01-20 23:13:41 +01:00
+ player.lastSave = MinecraftServer.currentTick; // Paper - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
this.playerIo.save(player);
ServerStatsCounter serverstatisticmanager = (ServerStatsCounter) player.getStats(); // CraftBukkit
2024-07-15 20:57:56 +02:00
@@ -1182,10 +1183,22 @@ public abstract class PlayerList {
2022-09-26 10:02:51 +02:00
}
public void saveAll() {
2024-01-20 23:13:41 +01:00
+ // Paper start - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
+ this.saveAll(-1);
+ }
+
+ public void saveAll(int interval) {
2022-10-24 21:43:46 +02:00
io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
2022-09-26 10:02:51 +02:00
MinecraftTimings.savePlayers.startTiming(); // Paper
+ int numSaved = 0;
+ long now = MinecraftServer.currentTick;
for (int i = 0; i < this.players.size(); ++i) {
- this.save(this.players.get(i));
+ ServerPlayer entityplayer = this.players.get(i);
+ if (interval == -1 || now - entityplayer.lastSave >= interval) {
+ this.save(entityplayer);
2023-05-27 20:34:33 +02:00
+ if (interval != -1 && ++numSaved >= io.papermc.paper.configuration.GlobalConfiguration.get().playerAutoSave.maxPerTick()) { break; }
2022-09-26 10:02:51 +02:00
+ }
2024-01-20 23:13:41 +01:00
+ // Paper end - Incremental chunk and player saving
2022-09-26 10:02:51 +02:00
}
MinecraftTimings.savePlayers.stopTiming(); // Paper
return null; }); // Paper - ensure main