aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0484-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0484-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch')
-rw-r--r--patches/server/0484-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/patches/server/0484-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch b/patches/server/0484-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
new file mode 100644
index 0000000000..602cc3a878
--- /dev/null
+++ b/patches/server/0484-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 d25f106ab64c90438f521a2c6fa944bdedc1969a..3d5e52d997a8e7d7f3b000e3737d30762aae2ca1 100644
+--- a/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
++++ b/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
+@@ -28,8 +28,10 @@ public class DataFixerBuilder {
+ private final Int2ObjectSortedMap<Schema> schemas = new Int2ObjectAVLTreeMap<>();
+ private final List<DataFix> globalList = Lists.newArrayList();
+ private final IntSortedSet fixerVersions = new IntAVLTreeSet();
++ private final int minDataFixPrecacheVersion; // Paper
+
+ public DataFixerBuilder(final int dataVersion) {
++ minDataFixPrecacheVersion = Integer.getInteger("Paper.minPrecachedDatafixVersion", dataVersion+1) * 10; // Paper - default to precache nothing - mojang stores versions * 10 to allow for 'sub versions'
+ this.dataVersion = dataVersion;
+ }
+
+@@ -74,6 +76,7 @@ public class DataFixerBuilder {
+ final IntBidirectionalIterator iterator = fixerUpper.fixerVersions().iterator();
+ while (iterator.hasNext()) {
+ final int versionKey = iterator.nextInt();
++ if (versionKey < minDataFixPrecacheVersion) continue; // Paper
+ final Schema schema = schemas.get(versionKey);
+ for (final String typeName : schema.types()) {
+ final CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {