Skip to content

Commit a0ea729

Browse files
committed
Fix minimum tick time reporting and off thread reading
1 parent 056268e commit a0ea729

File tree

8 files changed

+45
-25
lines changed

8 files changed

+45
-25
lines changed

paper-server/patches/features/0001-Moonrise-optimisation-patches.patch

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23030,7 +23030,7 @@ index e7510be12644b2edd966c538c84379a3d5fe89b5..8d299a75c80fddc61a2aa4dc5b0dc594
2303023030
thread1 -> {
2303123031
DedicatedServer dedicatedServer1 = new DedicatedServer(
2303223032
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
23033-
index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78c0f589cc 100644
23033+
index c62892b4656366fbeb65847fbeec95965e49c767..4d074f6f3c123f6ee6c63dbc37732d67ab964e4e 100644
2303423034
--- a/net/minecraft/server/MinecraftServer.java
2303523035
+++ b/net/minecraft/server/MinecraftServer.java
2303623036
@@ -177,7 +177,7 @@ import net.minecraft.world.phys.Vec2;
@@ -23042,7 +23042,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2304223042
private static MinecraftServer SERVER; // Paper
2304323043
public static final Logger LOGGER = LogUtils.getLogger();
2304423044
public static final net.kyori.adventure.text.logger.slf4j.ComponentLogger COMPONENT_LOGGER = net.kyori.adventure.text.logger.slf4j.ComponentLogger.logger(LOGGER.getName()); // Paper
23045-
@@ -362,6 +362,93 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23045+
@@ -370,6 +370,93 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2304623046
return minecraftServer;
2304723047
}
2304823048

@@ -23136,7 +23136,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2313623136
public MinecraftServer(
2313723137
// CraftBukkit start
2313823138
joptsimple.OptionSet options,
23139-
@@ -792,7 +879,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23139+
@@ -800,7 +887,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2314023140
serverLevel.setSpawnSettings(serverLevel.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && serverLevel.getGameRules().getBoolean(GameRules.RULE_SPAWN_MONSTERS)); // Paper - per level difficulty (from setDifficulty(ServerLevel, Difficulty, boolean))
2314123141
this.updateEffectiveRespawnData();
2314223142
this.forceTicks = false; // CraftBukkit
@@ -23145,7 +23145,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2314523145
new org.bukkit.event.world.WorldLoadEvent(serverLevel.getWorld()).callEvent(); // Paper - call WorldLoadEvent
2314623146
}
2314723147

23148-
@@ -815,6 +902,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23148+
@@ -823,6 +910,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2314923149
public abstract boolean shouldRconBroadcast();
2315023150

2315123151
public boolean saveAllChunks(boolean suppressLogs, boolean flush, boolean force) {
@@ -23157,7 +23157,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2315723157
boolean flag = false;
2315823158

2315923159
for (ServerLevel serverLevel : this.getAllLevels()) {
23160-
@@ -822,7 +914,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23160+
@@ -830,7 +922,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2316123161
LOGGER.info("Saving chunks for level '{}'/{}", serverLevel, serverLevel.dimension().location());
2316223162
}
2316323163

@@ -23166,7 +23166,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2316623166
flag = true;
2316723167
}
2316823168

23169-
@@ -912,7 +1004,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23169+
@@ -920,7 +1012,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2317023170
}
2317123171
}
2317223172

@@ -23175,7 +23175,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2317523175
this.nextTickTimeNanos = Util.getNanos() + TimeUtil.NANOSECONDS_PER_MILLISECOND;
2317623176

2317723177
for (ServerLevel serverLevelx : this.getAllLevels()) {
23178-
@@ -922,18 +1014,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23178+
@@ -930,18 +1022,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2317923179

2318023180
this.waitUntilNextTick();
2318123181
}
@@ -23201,7 +23201,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2320123201

2320223202
this.isSaving = false;
2320323203
this.resources.close();
23204-
@@ -953,6 +1041,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23204+
@@ -961,6 +1049,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2320523205
this.services().nameToIdCache().save(false); // Paper - Perf: Async GameProfileCache saving
2320623206
}
2320723207
// Spigot end
@@ -23216,7 +23216,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2321623216
// Paper start - Improved watchdog support - move final shutdown items here
2321723217
Util.shutdownExecutors();
2321823218
try {
23219-
@@ -1045,16 +1141,31 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23219+
@@ -1053,16 +1149,31 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2322023220
// execute small amounts of other tasks just in case the number of tasks we are
2322123221
// draining is large - chunk system and packet processing may be latency sensitive
2322223222

@@ -23251,7 +23251,7 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2325123251
profiler.pop(); // moonrise:run_all_chunk
2325223252
profiler.pop(); // moonrise:run_all_tasks
2325323253

23254-
@@ -1195,11 +1306,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23254+
@@ -1203,11 +1314,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2325523255
ProfilerFiller profilerFiller = Profiler.get();
2325623256
profilerFiller.push("tick");
2325723257
this.tickFrame.start();
@@ -23270,15 +23270,15 @@ index f1ec0b9c3f8fe7811e36a66f8091a0a9f5a72d13..4eb16776b25aa4163949b00339971d78
2327023270
this.tickFrame.end();
2327123271
this.recordEndOfTick(); // Paper - improve tick loop
2327223272
profilerFiller.popPush("nextTickWait");
23273-
@@ -1372,6 +1487,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23273+
@@ -1380,6 +1495,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2327423274

2327523275
private boolean pollTaskInternal() {
2327623276
if (super.pollTask()) {
2327723277
+ this.moonrise$executeMidTickTasks(); // Paper - rewrite chunk system
2327823278
return true;
2327923279
} else {
2328023280
boolean ret = false; // Paper - force execution of all worlds, do not just bias the first
23281-
@@ -2547,6 +2663,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
23281+
@@ -2555,6 +2671,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2328223282
}
2328323283
}
2328423284

paper-server/patches/features/0002-Rewrite-dataconverter-system.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32910,10 +32910,10 @@ index 71b8bbeda2fecf930870a9b6e856e20639d31645..91650a92a21fcaac65a5dfcac0cc856b
3291032910
return structureTemplate.save(new CompoundTag());
3291132911
}
3291232912
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
32913-
index 174ee247eaaf2e2352f4ccc099e31a8240e86b71..2bb59acb87f0a230b7cf4870477fc65bea18f3e3 100644
32913+
index 4d074f6f3c123f6ee6c63dbc37732d67ab964e4e..ff9f7acdd99b57dde99ab132fb089c3aabb68436 100644
3291432914
--- a/net/minecraft/server/MinecraftServer.java
3291532915
+++ b/net/minecraft/server/MinecraftServer.java
32916-
@@ -348,6 +348,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
32916+
@@ -356,6 +356,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
3291732917
// Paper end - improve tick loop
3291832918

3291932919
public static <S extends MinecraftServer> S spin(Function<Thread, S> threadFunction) {

paper-server/patches/features/0021-Incremental-chunk-and-player-saving.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ Subject: [PATCH] Incremental chunk and player saving
55

66

77
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
8-
index 9c69198fafdb24d9da525f81f002af77234636ae..788f21acf6889e623506cd205222e6acb7cf6c98 100644
8+
index ff9f7acdd99b57dde99ab132fb089c3aabb68436..cc9a4f00cd86a8c5208695aa730ce8e84ab0ed3f 100644
99
--- a/net/minecraft/server/MinecraftServer.java
1010
+++ b/net/minecraft/server/MinecraftServer.java
11-
@@ -938,7 +938,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
11+
@@ -946,7 +946,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
1212
boolean var4;
1313
try {
1414
this.isSaving = true;
@@ -17,7 +17,7 @@ index 9c69198fafdb24d9da525f81f002af77234636ae..788f21acf6889e623506cd205222e6ac
1717
var4 = this.saveAllChunks(suppressLogs, flush, force);
1818
} finally {
1919
this.isSaving = false;
20-
@@ -1595,9 +1595,29 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
20+
@@ -1603,9 +1603,29 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2121
}
2222

2323
this.ticksUntilAutosave--;

paper-server/patches/features/0026-Optimise-EntityScheduler-ticking.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ index a2fbc13105673e926cbaed69221826ebd392140f..a42938e1abd371dba6806e65552fde71
2020

2121
@Override
2222
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
23-
index 788f21acf6889e623506cd205222e6acb7cf6c98..5ae6119b83c7971a769de66960f5f01ab5a51fa1 100644
23+
index cc9a4f00cd86a8c5208695aa730ce8e84ab0ed3f..5d268ad1211fe936813f8195ae3e82265595f359 100644
2424
--- a/net/minecraft/server/MinecraftServer.java
2525
+++ b/net/minecraft/server/MinecraftServer.java
26-
@@ -1709,33 +1709,22 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
26+
@@ -1717,33 +1717,22 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
2727
}
2828
}
2929

paper-server/patches/features/0029-Optimize-Hoppers.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ index 0000000000000000000000000000000000000000..24a2090e068ad3c0d08705050944abdf
4848
+ }
4949
+}
5050
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
51-
index 5ae6119b83c7971a769de66960f5f01ab5a51fa1..fda102773812f239cd8dbbe19f742c9f028422c2 100644
51+
index 5d268ad1211fe936813f8195ae3e82265595f359..806184fac2b7fcb5b8cb3adc9b212bdc475699e9 100644
5252
--- a/net/minecraft/server/MinecraftServer.java
5353
+++ b/net/minecraft/server/MinecraftServer.java
54-
@@ -1764,6 +1764,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
54+
@@ -1772,6 +1772,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
5555
serverLevel.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent
5656
serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
5757
serverLevel.updateLagCompensationTick(); // Paper - lag compensation

paper-server/patches/sources/net/minecraft/server/MinecraftServer.java.patch

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
private int playerIdleTimeout;
4242
private final long[] tickTimesNanos = new long[100];
4343
private long aggregatedTickTimesNanos = 0L;
44-
@@ -278,10 +_,78 @@
44+
@@ -278,10 +_,86 @@
4545
private final DiscontinuousFrame tickFrame;
4646
private final PacketProcessor packetProcessor;
4747

@@ -70,6 +70,7 @@
7070
+ // Paper start - improve tick loop
7171
+ public final ca.spottedleaf.moonrise.common.time.TickData tickTimes1s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(1L));
7272
+ public final ca.spottedleaf.moonrise.common.time.TickData tickTimes5s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(5L));
73+
+ public @Nullable ca.spottedleaf.moonrise.common.time.TickData.TickReportData tickReport5s;
7374
+ public final ca.spottedleaf.moonrise.common.time.TickData tickTimes10s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(10L));
7475
+ public final ca.spottedleaf.moonrise.common.time.TickData tickTimes15s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(15L));
7576
+ public final ca.spottedleaf.moonrise.common.time.TickData tickTimes1m = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.MINUTES.toNanos(1L));
@@ -81,15 +82,18 @@
8182
+ private long lastTickStart;
8283
+ private long currentTickStart;
8384
+ private long scheduledTickStart;
85+
+ private double[] tps = new double[]{0.0, 0.0, 0.0};
8486
+
8587
+ private void addTickTime(final ca.spottedleaf.moonrise.common.time.TickTime time) {
8688
+ this.tickTimes1s.addDataFrom(time);
8789
+ this.tickTimes5s.addDataFrom(time);
90+
+ this.tickReport5s = this.tickTimes5s.generateTickReport(null, System.nanoTime(), this.tickRateManager().nanosecondsPerTick());
8891
+ this.tickTimes10s.addDataFrom(time);
8992
+ this.tickTimes15s.addDataFrom(time);
9093
+ this.tickTimes1m.addDataFrom(time);
9194
+ this.tickTimes5m.addDataFrom(time);
9295
+ this.tickTimes15m.addDataFrom(time);
96+
+ this.tps = this.computeTPS();
9397
+ }
9498
+
9599
+ private static double getTPS(final ca.spottedleaf.moonrise.common.time.TickData tickData, final long timeNow, final long tickInterval) {
@@ -102,6 +106,10 @@
102106
+ }
103107
+
104108
+ public double[] getTPS() {
109+
+ return this.tps;
110+
+ }
111+
+
112+
+ public double[] computeTPS() {
105113
+ final long now = System.nanoTime();
106114
+ final long interval = this.tickRateManager().nanosecondsPerTick();
107115
+ return new double[] {

paper-server/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,12 @@ private static record TickInformation(
103103
long tickTimeCPU
104104
) {}
105105

106-
// rets null if there is no data
107106
public TickReportData generateTickReport(final TickTime inProgress, final long endTime, final long tickInterval) {
107+
return this.generateTickReport(inProgress, endTime, tickInterval, true);
108+
}
109+
110+
// rets null if there is no data
111+
public TickReportData generateTickReport(final TickTime inProgress, final long endTime, final long tickInterval, final boolean trimLast) {
108112
if (this.timeData.isEmpty() && inProgress == null) {
109113
return null;
110114
}
@@ -215,6 +219,14 @@ public TickReportData generateTickReport(final TickTime inProgress, final long e
215219
}
216220

217221

222+
if (trimLast) {
223+
// Avoid skewing data with task execution time of in-progress tick
224+
collapsedData.removeLast();
225+
if (collapsedData.isEmpty()) {
226+
return null;
227+
}
228+
}
229+
218230
final int collectedTicks = collapsedData.size();
219231
final long[] tickStartToStartDifferences = new long[collectedTicks];
220232
final long[] timePerTickDataRaw = new long[collectedTicks];

paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2695,13 +2695,13 @@ public UnsafeValues getUnsafe() {
26952695

26962696
@Override
26972697
public long[] getTickTimes() {
2698-
final TickData.TickReportData reportData = this.getServer().tickTimes5s.generateTickReport(null, System.nanoTime(), this.getServer().tickRateManager().nanosecondsPerTick());
2698+
final TickData.TickReportData reportData = this.getServer().tickReport5s;
26992699
return reportData == null ? new long[0] : reportData.timePerTickData().rawData();
27002700
}
27012701

27022702
@Override
27032703
public double getAverageTickTime() {
2704-
final TickData.TickReportData reportData = this.getServer().tickTimes5s.generateTickReport(null, System.nanoTime(), this.getServer().tickRateManager().nanosecondsPerTick());
2704+
final TickData.TickReportData reportData = this.getServer().tickReport5s;
27052705
return reportData == null ? 0.0 : reportData.timePerTickData().segmentAll().average() * 1.0E-6D;
27062706
}
27072707

0 commit comments

Comments
 (0)