Improve MT-Safety of UserCache (#2080)

We were missing a synchronize on a get if cached method, however
it appears that using a ConcurrentHashMap is a better solution
so readers can avoid locking if they just want a cached value.

Existing synchronization for writers remains untouched, the
ConcurrentHashMap is just so readers can safely read without
synchronization
This commit is contained in:
Spottedleaf
2019-05-26 23:17:50 -07:00
parent 78a4e64734
commit 66554efabb
2 changed files with 27 additions and 19 deletions

View File

@@ -10,7 +10,7 @@ Additionally, move Saving of the User cache to be done async, incase
the user never changed the default setting for Spigot's save on stop only.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index a3c53d9dbf..3b745b2b75 100644
index d3d8fffeb0..f142ed9a3b 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
@@ -23,9 +23,20 @@ index a3c53d9dbf..3b745b2b75 100644
// Spigot end
}
diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
index 41be5bf64e..cd8a652eb6 100644
index 41be5bf64e..dc5c0afab4 100644
--- a/src/main/java/net/minecraft/server/UserCache.java
+++ b/src/main/java/net/minecraft/server/UserCache.java
@@ -0,0 +0,0 @@ public class UserCache {
public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
private static boolean c;
- private final Map<String, UserCache.UserCacheEntry> d = Maps.newHashMap();
- private final Map<UUID, UserCache.UserCacheEntry> e = Maps.newHashMap();
+ private final Map<String, UserCache.UserCacheEntry> d = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
+ private final Map<UUID, UserCache.UserCacheEntry> e = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
private final Deque<GameProfile> f = new java.util.concurrent.LinkedBlockingDeque<GameProfile>(); // CraftBukkit
private final GameProfileRepository g;
protected final Gson b;
@@ -0,0 +0,0 @@ public class UserCache {
this.a(gameprofile, (Date) null);
}
@@ -61,11 +72,8 @@ index 41be5bf64e..cd8a652eb6 100644
+ @Nullable public GameProfile getProfile(UUID uuid) { return a(uuid); } // Paper - OBFHELPER
@Nullable
- public GameProfile a(UUID uuid) {
+ public synchronized GameProfile a(UUID uuid) { // Paper - synchronize
public GameProfile a(UUID uuid) {
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.e.get(uuid);
return usercache_usercacheentry == null ? null : usercache_usercacheentry.a();
@@ -0,0 +0,0 @@ public class UserCache {
}