aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
diff options
context:
space:
mode:
authormaxcom1 <[email protected]>2024-03-23 22:26:17 +0100
committerGitHub <[email protected]>2024-03-23 17:26:17 -0400
commitb6001403e9703cadaa6e8c8558e732b91c3c6d6e (patch)
treea8c57bbc334a8ad48d4ad2b43db335667b142bee /patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
parent9ec7dfcbc41c6e625de0050b6997160a75df9f44 (diff)
downloadPaper-b6001403e9703cadaa6e8c8558e732b91c3c6d6e.tar.gz
Paper-b6001403e9703cadaa6e8c8558e732b91c3c6d6e.zip
Add methods to change entity physics (#10334)
Diffstat (limited to 'patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch')
-rw-r--r--patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch54
1 files changed, 54 insertions, 0 deletions
diff --git a/patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch b/patches/server/0429-Cache-DataFixerUpper-Rewrite-Rules-on-demand.patch
new file mode 100644
index 0000000000..572dc995c0
--- /dev/null
+++ b/patches/server/0429-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 cd812f3fe362de5ddc414862dedab2e9727ca776..2bc69e84b4e2ba8f816322d649e42570ab9242e5 100644
+--- a/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
++++ b/src/main/java/com/mojang/datafixers/DataFixerBuilder.java
+@@ -30,8 +30,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 - 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;
+ }
+
+@@ -78,6 +80,7 @@ public class DataFixerBuilder {
+ final IntBidirectionalIterator 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)) {