aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch')
-rw-r--r--patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch176
1 files changed, 0 insertions, 176 deletions
diff --git a/patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch b/patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch
deleted file mode 100644
index aecd8e5402..0000000000
--- a/patches/unapplied/server/1020-Execute-chunk-tasks-mid-tick.patch
+++ /dev/null
@@ -1,176 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Spottedleaf <[email protected]>
-Date: Mon, 6 Apr 2020 04:20:44 -0700
-Subject: [PATCH] Execute chunk tasks mid-tick
-
-This will help the server load chunks if tick times are high.
-
-diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java
-index 6b3cde6d4d1e63bec01f502f2027ee9fddac08aa..46449728f69ee7d4f78470f8da23c055acd53a3b 100644
---- a/src/main/java/co/aikar/timings/MinecraftTimings.java
-+++ b/src/main/java/co/aikar/timings/MinecraftTimings.java
-@@ -48,6 +48,8 @@ public final class MinecraftTimings {
- public static final Timing antiXrayObfuscateTimer = Timings.ofSafe("anti-xray - obfuscate");
- public static final Timing scoreboardScoreSearch = Timings.ofSafe("Scoreboard score search"); // Paper - add timings for scoreboard search
-
-+ public static final Timing midTickChunkTasks = Timings.ofSafe("Mid Tick Chunk Tasks");
-+
- private static final Map<Class<?>, String> taskNameCache = new MapMaker().weakKeys().makeMap();
-
- private MinecraftTimings() {}
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 03552ca486807d057147f6a05f024989d593d046..64ae2745c3144d43cad12dfe9baf1a291756d129 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1411,8 +1411,79 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- return flag;
- }
-
-+ // Paper start - execute chunk tasks mid tick
-+ static final long CHUNK_TASK_QUEUE_BACKOFF_MIN_TIME = 25L * 1000L; // 25us
-+ static final long MAX_CHUNK_EXEC_TIME = 1000L; // 1us
-+
-+ static final long TASK_EXECUTION_FAILURE_BACKOFF = 5L * 1000L; // 5us
-+
-+ private static long lastMidTickExecute;
-+ private static long lastMidTickExecuteFailure;
-+
-+ private boolean tickMidTickTasks() {
-+ // give all worlds a fair chance at by targetting them all.
-+ // if we execute too many tasks, that's fine - we have logic to correctly handle overuse of allocated time.
-+ boolean executed = false;
-+ for (ServerLevel world : this.getAllLevels()) {
-+ long currTime = System.nanoTime();
-+ if (currTime - world.lastMidTickExecuteFailure <= TASK_EXECUTION_FAILURE_BACKOFF) {
-+ continue;
-+ }
-+ if (!world.getChunkSource().pollTask()) {
-+ // we need to back off if this fails
-+ world.lastMidTickExecuteFailure = currTime;
-+ } else {
-+ executed = true;
-+ }
-+ }
-+
-+ return executed;
-+ }
-+
-+ public final void executeMidTickTasks() {
-+ org.spigotmc.AsyncCatcher.catchOp("mid tick chunk task execution");
-+ long startTime = System.nanoTime();
-+ if ((startTime - lastMidTickExecute) <= CHUNK_TASK_QUEUE_BACKOFF_MIN_TIME || (startTime - lastMidTickExecuteFailure) <= TASK_EXECUTION_FAILURE_BACKOFF) {
-+ // it's shown to be bad to constantly hit the queue (chunk loads slow to a crawl), even if no tasks are executed.
-+ // so, backoff to prevent this
-+ return;
-+ }
-+
-+ co.aikar.timings.MinecraftTimings.midTickChunkTasks.startTiming();
-+ try {
-+ for (;;) {
-+ boolean moreTasks = this.tickMidTickTasks();
-+ long currTime = System.nanoTime();
-+ long diff = currTime - startTime;
-+
-+ if (!moreTasks || diff >= MAX_CHUNK_EXEC_TIME) {
-+ if (!moreTasks) {
-+ lastMidTickExecuteFailure = currTime;
-+ }
-+
-+ // note: negative values reduce the time
-+ long overuse = diff - MAX_CHUNK_EXEC_TIME;
-+ if (overuse >= (10L * 1000L * 1000L)) { // 10ms
-+ // make sure something like a GC or dumb plugin doesn't screw us over...
-+ overuse = 10L * 1000L * 1000L; // 10ms
-+ }
-+
-+ double overuseCount = (double)overuse/(double)MAX_CHUNK_EXEC_TIME;
-+ long extraSleep = (long)Math.round(overuseCount*CHUNK_TASK_QUEUE_BACKOFF_MIN_TIME);
-+
-+ lastMidTickExecute = currTime + extraSleep;
-+ return;
-+ }
-+ }
-+ } finally {
-+ co.aikar.timings.MinecraftTimings.midTickChunkTasks.stopTiming();
-+ }
-+ }
-+ // Paper end - execute chunk tasks mid tick
-+
- private boolean pollTaskInternal() {
- if (super.pollTask()) {
-+ this.executeMidTickTasks(); // Paper - execute chunk tasks mid tick
- return true;
- } else {
- boolean ret = false; // Paper - force execution of all worlds, do not just bias the first
-diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-index 6b258a2bd85bb71b030d42b488e1a4742d1e147d..01577dbb16ff6abc9edcf897f7fadaad14350184 100644
---- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
-@@ -559,6 +559,7 @@ public class ServerChunkCache extends ChunkSource {
- boolean flag1 = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
- Iterator iterator1 = list.iterator();
-
-+ int chunksTicked = 0; // Paper
- while (iterator1.hasNext()) {
- ServerChunkCache.ChunkAndHolder chunkproviderserver_a = (ServerChunkCache.ChunkAndHolder) iterator1.next();
- LevelChunk chunk1 = chunkproviderserver_a.chunk;
-@@ -572,6 +573,7 @@ public class ServerChunkCache extends ChunkSource {
-
- if (this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) {
- this.level.tickChunk(chunk1, l);
-+ if ((chunksTicked++ & 1) == 0) net.minecraft.server.MinecraftServer.getServer().executeMidTickTasks(); // Paper
- }
- }
- }
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 1ec7865e2e2bd23607e9b3041d77bd4badf39a4a..3a49f8933bc6ca1862994b7e0b3006f5236dd94a 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -221,6 +221,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
- private final StructureCheck structureCheck;
- private final boolean tickTime;
- private final RandomSequences randomSequences;
-+ public long lastMidTickExecuteFailure; // Paper - execute chunk tasks mid tick
-
- // CraftBukkit start
- public final LevelStorageSource.LevelStorageAccess convertable;
-@@ -1211,6 +1212,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
- if (fluid1.is(fluid)) {
- fluid1.tick(this, pos);
- }
-+ MinecraftServer.getServer().executeMidTickTasks(); // Paper - exec chunk tasks during world tick
-
- }
-
-@@ -1220,6 +1222,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
- if (iblockdata.is(block)) {
- iblockdata.tick(this, pos, this.random);
- }
-+ MinecraftServer.getServer().executeMidTickTasks(); // Paper - exec chunk tasks during world tick
-
- }
-
-diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index d3d7abb2d31e8ce9f9c53eca66a83a1c28fec792..dab55ab08665f2b5ae0c899a4ab07c18460552ae 100644
---- a/src/main/java/net/minecraft/world/level/Level.java
-+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -915,6 +915,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- // Spigot end
- } else if (flag && this.shouldTickBlocksAt(tickingblockentity.getPos())) {
- tickingblockentity.tick();
-+ // Paper start - execute chunk tasks during tick
-+ if ((this.tileTickPosition & 7) == 0) {
-+ MinecraftServer.getServer().executeMidTickTasks();
-+ }
-+ // Paper end - execute chunk tasks during tick
- }
- }
- this.blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075
-@@ -929,6 +934,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- public <T extends Entity> void guardEntityTick(Consumer<T> tickConsumer, T entity) {
- try {
- tickConsumer.accept(entity);
-+ MinecraftServer.getServer().executeMidTickTasks(); // Paper - execute chunk tasks mid tick
- } catch (Throwable throwable) {
- if (throwable instanceof ThreadDeath) throw throwable; // Paper
- // Paper start - Prevent block entity and entity crashes