Skip to content

Commit 87e11bf

Browse files
Cache resource keys instead of trying to create them (#7643)
1 parent ea2c81e commit 87e11bf

File tree

3 files changed

+71
-8
lines changed

3 files changed

+71
-8
lines changed

patches/server/0573-Add-PaperRegistry.patch

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ PaperRegistry is a server-backed impl of bukkit's Registry interface
77

88
diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistry.java b/src/main/java/io/papermc/paper/registry/PaperRegistry.java
99
new file mode 100644
10-
index 0000000000000000000000000000000000000000..51cec316df8bc0c7d36e0b1dfdf8d9fae04e3606
10+
index 0000000000000000000000000000000000000000..8d1f3c4891870b4239df678dd1e52e9f4ef74b2c
1111
--- /dev/null
1212
+++ b/src/main/java/io/papermc/paper/registry/PaperRegistry.java
13-
@@ -0,0 +1,145 @@
13+
@@ -0,0 +1,147 @@
1414
+package io.papermc.paper.registry;
1515
+
1616
+import com.google.common.base.Preconditions;
@@ -34,6 +34,7 @@ index 0000000000000000000000000000000000000000..51cec316df8bc0c7d36e0b1dfdf8d9fa
3434
+import java.util.Map;
3535
+import java.util.Objects;
3636
+import java.util.Optional;
37+
+import java.util.concurrent.ConcurrentHashMap;
3738
+import java.util.function.Supplier;
3839
+
3940
+@DefaultQualifier(NonNull.class)
@@ -49,7 +50,8 @@ index 0000000000000000000000000000000000000000..51cec316df8bc0c7d36e0b1dfdf8d9fa
4950
+ private boolean registered;
5051
+ private final RegistryKey<API, MINECRAFT> registryKey;
5152
+ private final Supplier<Registry<MINECRAFT>> registry;
52-
+ private final Map<NamespacedKey, API> cache = new HashMap<>();
53+
+ private final Map<NamespacedKey, API> cache = new ConcurrentHashMap<>();
54+
+ private final Map<NamespacedKey, ResourceKey<MINECRAFT>> resourceKeyCache = new ConcurrentHashMap<>();
5355
+
5456
+ public PaperRegistry(RegistryKey<API, MINECRAFT> registryKey) {
5557
+ this.registryKey = registryKey;
@@ -93,7 +95,7 @@ index 0000000000000000000000000000000000000000..51cec316df8bc0c7d36e0b1dfdf8d9fa
9395
+ }
9496
+
9597
+ public Holder<MINECRAFT> getMinecraftHolder(API apiValue) {
96-
+ return this.registry.get().getHolderOrThrow(ResourceKey.create(this.registryKey.resourceKey(), CraftNamespacedKey.toMinecraft(apiValue.getKey())));
98+
+ return this.registry.get().getHolderOrThrow(this.resourceKeyCache.computeIfAbsent(apiValue.getKey(), key -> ResourceKey.create(this.registryKey.resourceKey(), CraftNamespacedKey.toMinecraft(key))));
9799
+ }
98100
+
99101
+ @Override

patches/server/0856-Add-GameEvent-tags.patch

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ Subject: [PATCH] Add GameEvent tags
66

77
diff --git a/src/main/java/io/papermc/paper/CraftGameEventTag.java b/src/main/java/io/papermc/paper/CraftGameEventTag.java
88
new file mode 100644
9-
index 0000000000000000000000000000000000000000..d5d3c66afb408026513ac436eb1f4fdd381847bf
9+
index 0000000000000000000000000000000000000000..cb78a3d4e21376ea24347187478525d5f0c24079
1010
--- /dev/null
1111
+++ b/src/main/java/io/papermc/paper/CraftGameEventTag.java
12-
@@ -0,0 +1,30 @@
12+
@@ -0,0 +1,34 @@
1313
+package io.papermc.paper;
1414
+
1515
+import net.minecraft.core.Registry;
@@ -20,6 +20,9 @@ index 0000000000000000000000000000000000000000..d5d3c66afb408026513ac436eb1f4fdd
2020
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
2121
+import org.jetbrains.annotations.NotNull;
2222
+
23+
+import java.util.Collections;
24+
+import java.util.IdentityHashMap;
25+
+import java.util.Map;
2326
+import java.util.Objects;
2427
+import java.util.Set;
2528
+import java.util.stream.Collectors;
@@ -30,9 +33,10 @@ index 0000000000000000000000000000000000000000..d5d3c66afb408026513ac436eb1f4fdd
3033
+ super(registry, tag);
3134
+ }
3235
+
36+
+ private static final Map<GameEvent, ResourceKey<net.minecraft.world.level.gameevent.GameEvent>> KEY_CACHE = Collections.synchronizedMap(new IdentityHashMap<>());
3337
+ @Override
34-
+ public boolean isTagged(@NotNull GameEvent item) {
35-
+ return registry.getHolderOrThrow(ResourceKey.create(Registry.GAME_EVENT_REGISTRY, CraftNamespacedKey.toMinecraft(item.getKey()))).is(tag);
38+
+ public boolean isTagged(@NotNull GameEvent gameEvent) {
39+
+ return registry.getHolderOrThrow(KEY_CACHE.computeIfAbsent(gameEvent, event -> ResourceKey.create(Registry.GAME_EVENT_REGISTRY, CraftNamespacedKey.toMinecraft(event.getKey())))).is(tag);
3640
+ }
3741
+
3842
+ @Override
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Jake Potrebic <jake.m.potrebic@gmail.com>
3+
Date: Sun, 20 Mar 2022 22:06:47 -0700
4+
Subject: [PATCH] cache resource keys
5+
6+
7+
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
8+
index a52e76c8870b1dd578c4332930c6f2fd3b31d471..ca9904ded51580425f06587b7eed72da7b95d2f1 100644
9+
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
10+
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
11+
@@ -366,12 +366,13 @@ public class CraftBlock implements Block {
12+
return (biome == null) ? Biome.CUSTOM : biome;
13+
}
14+
15+
+ private static final java.util.Map<org.bukkit.block.Biome, net.minecraft.resources.ResourceKey<net.minecraft.world.level.biome.Biome>> BIOME_KEY_CACHE = Collections.synchronizedMap(new java.util.EnumMap<>(Biome.class)); // Paper
16+
public static Holder<net.minecraft.world.level.biome.Biome> biomeToBiomeBase(net.minecraft.core.Registry<net.minecraft.world.level.biome.Biome> registry, Biome bio) {
17+
if (bio == null || bio == Biome.CUSTOM) {
18+
return null;
19+
}
20+
21+
- return registry.getHolderOrThrow(ResourceKey.create(net.minecraft.core.Registry.BIOME_REGISTRY, CraftNamespacedKey.toMinecraft(bio.getKey())));
22+
+ return registry.getHolderOrThrow(BIOME_KEY_CACHE.computeIfAbsent(bio, b -> ResourceKey.create(net.minecraft.core.Registry.BIOME_REGISTRY, CraftNamespacedKey.toMinecraft(b.getKey())))); // Paper - cache key
23+
}
24+
25+
@Override
26+
diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftEntityTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftEntityTag.java
27+
index 393bb27648501c6f25cf846e929f4c95b1a0b11f..979f82d589e378b9e52417d20b48d66f077f5dfd 100644
28+
--- a/src/main/java/org/bukkit/craftbukkit/tag/CraftEntityTag.java
29+
+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftEntityTag.java
30+
@@ -16,9 +16,10 @@ public class CraftEntityTag extends CraftTag<net.minecraft.world.entity.EntityTy
31+
super(registry, tag);
32+
}
33+
34+
+ private static final java.util.Map<org.bukkit.entity.EntityType, net.minecraft.resources.ResourceKey<net.minecraft.world.entity.EntityType<?>>> KEY_CACHE = Collections.synchronizedMap(new java.util.EnumMap<>(EntityType.class)); // Paper
35+
@Override
36+
public boolean isTagged(EntityType entity) {
37+
- return registry.getHolderOrThrow(ResourceKey.create(net.minecraft.core.Registry.ENTITY_TYPE_REGISTRY, CraftNamespacedKey.toMinecraft(entity.getKey()))).is(tag);
38+
+ return registry.getHolderOrThrow(KEY_CACHE.computeIfAbsent(entity, type -> ResourceKey.create(net.minecraft.core.Registry.ENTITY_TYPE_REGISTRY, CraftNamespacedKey.toMinecraft(type.getKey())))).is(tag); // Paper - cache key
39+
}
40+
41+
@Override
42+
diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
43+
index cdd474e9b0363641839a66d3e61fec46c735879a..3611e3e9d33a0f1d82a78a27ea5c2c649225f564 100644
44+
--- a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
45+
+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
46+
@@ -14,9 +14,10 @@ public class CraftFluidTag extends CraftTag<net.minecraft.world.level.material.F
47+
super(registry, tag);
48+
}
49+
50+
+ private static final java.util.Map<Fluid, net.minecraft.resources.ResourceKey<net.minecraft.world.level.material.Fluid>> KEY_CACHE = Collections.synchronizedMap(new java.util.EnumMap<>(Fluid.class)); // Paper
51+
@Override
52+
public boolean isTagged(Fluid fluid) {
53+
- return registry.getHolderOrThrow(net.minecraft.resources.ResourceKey.create(net.minecraft.core.Registry.FLUID_REGISTRY, org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(fluid.getKey()))).is(tag); // Paper
54+
+ return registry.getHolderOrThrow(KEY_CACHE.computeIfAbsent(fluid, f -> net.minecraft.resources.ResourceKey.create(net.minecraft.core.Registry.FLUID_REGISTRY, org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(f.getKey())))).is(tag); // Paper - cache key
55+
}
56+
57+
@Override

0 commit comments

Comments
 (0)