aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-12-05 11:18:29 +0100
committerNassim Jahnke <[email protected]>2024-12-05 12:20:56 +0100
commite4e24f3335609b38f460ced71d18babcf11bf9cb (patch)
tree51880d664b3444ce26d6f8cdeb3b8219e5616fca /patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
parentc54c062e6ff742445bf7749c84106ca67090172d (diff)
downloadPaper-e4e24f3335609b38f460ced71d18babcf11bf9cb.tar.gz
Paper-e4e24f3335609b38f460ced71d18babcf11bf9cb.zip
Move around patches again
Diffstat (limited to 'patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch')
-rw-r--r--patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch b/patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
new file mode 100644
index 0000000000..9a0c6f1492
--- /dev/null
+++ b/patches/server/0402-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
@@ -0,0 +1,54 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Sat, 12 Sep 2020 17:21:38 -0400
+Subject: [PATCH] Cache DataFixerUpper Rewrite Rules on demand
+
+Mojang precaches every single potential rewrite rule that could ever
+exist on server startup. This includes rules from all the way back to versions from 6+ years ago.
+
+This is the source of why the server hogs every CPU core at 100% every start.
+
+For anyone who hard resets for updates or has force upgraded their entire world, this
+results in completely wasted cpu cycles.
+
+This massive CPU usage also delays server startup time.
+
+We improve this by making "min version to precache" that defaults to a future version
+so that no rewrite rules are precached.
+
+someone who expects to be converting a lot chunks could theoretically set
+-DPaper.minPrecachedDatafixVersion=<dataVersionConvertingFrom> as a startup
+parameter and only build from that point on.
+
+However this will likely never be needed as the server will still run
+the same cache logic on demand when it's actually needed. The only
+cost would be some delay on the FIRST chunk conversion, but paper already
+runs chunk conversions on another thread so this will likely never be
+a concern for TPS.
+
+This patch will significantly reduce CPU use on startup, reduce memory usage,
+and improve server startup time.
+
+diff --git a/src/main/java/com/mojang/datafixers/DataFixerBuilder.java b/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
+index 4232ce05ad7dd122a78a04ccef3b59d4caf542df..2cce259c738de2680e219d30dc3020458f4442d6 100644
+--- a/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
++++ b/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
+@@ -29,8 +29,10 @@ public class DataFixerBuilder {
+ private final Int2ObjectSortedMap<Schema> schemas = new Int2ObjectAVLTreeMap<>();
+ private final List<DataFix> globalList = new ArrayList<>();
+ private final IntSortedSet fixerVersions = new IntAVLTreeSet();
++ private final int minDataFixPrecacheVersion; // Paper - Perf: Cache DataFixerUpper Rewrite Rules on demand
+
+ public DataFixerBuilder(final int dataVersion) {
++ minDataFixPrecacheVersion = Integer.getInteger("Paper.minPrecachedDatafixVersion", dataVersion+1) * 10; // Paper - Perf: default to precache nothing - mojang stores versions * 10 to allow for 'sub versions'
+ this.dataVersion = dataVersion;
+ }
+
+@@ -88,6 +90,7 @@ public class DataFixerBuilder {
+ final IntIterator iterator = fixerUpper.fixerVersions().iterator();
+ while (iterator.hasNext()) {
+ final int versionKey = iterator.nextInt();
++ if (versionKey < minDataFixPrecacheVersion) continue; // Paper - Perf: Cache DataFixerUpper Rewrite Rules on demand
+ final Schema schema = schemas.get(versionKey);
+ for (final String typeName : schema.types()) {
+ if (!requiredTypeNames.contains(typeName)) {