Paper/Spigot-Server-Patches/0132-Optimize-UserCache-Thread-Safe.patch

101 lines
3.6 KiB
Diff
Raw Normal View History

2018-01-11 05:31:19 +00:00
From b2d6f011c1e3f4c42b42a9fe36258ce99d534da6 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Mon, 16 May 2016 20:47:41 -0400
Subject: [PATCH] Optimize UserCache / Thread Safe
Because Techable keeps complaining about how this isn't thread safe,
easier to do this than replace the entire thing.
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
2018-01-11 05:31:19 +00:00
index 45d3dbde..ab793307 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
2017-08-03 14:36:06 +00:00
@@ -528,7 +528,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IAs
// Spigot start
if (org.spigotmc.SpigotConfig.saveUserCacheOnStopOnly) {
LOGGER.info("Saving usercache.json");
2016-11-17 02:23:38 +00:00
- this.Y.c();
+ this.Y.c(false); // Paper
}
// Spigot end
}
diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
2018-01-11 05:31:19 +00:00
index 487fc11f..924dc63a 100644
--- a/src/main/java/net/minecraft/server/UserCache.java
+++ b/src/main/java/net/minecraft/server/UserCache.java
2017-05-14 18:05:01 +00:00
@@ -109,7 +109,7 @@ public class UserCache {
this.a(gameprofile, (Date) null);
}
- private void a(GameProfile gameprofile, Date date) {
+ private synchronized void a(GameProfile gameprofile, Date date) { // Paper - synchronize
UUID uuid = gameprofile.getId();
if (date == null) {
2017-05-14 18:05:01 +00:00
@@ -123,8 +123,9 @@ public class UserCache {
String s = gameprofile.getName().toLowerCase(Locale.ROOT);
UserCache.UserCacheEntry usercache_usercacheentry = new UserCache.UserCacheEntry(gameprofile, date, null);
- if (this.e.containsKey(uuid)) {
+ //if (this.e.containsKey(uuid)) { // Paper
UserCache.UserCacheEntry usercache_usercacheentry1 = (UserCache.UserCacheEntry) this.e.get(uuid);
+ if (usercache_usercacheentry1 != null) { // Paper
this.d.remove(usercache_usercacheentry1.a().getName().toLowerCase(Locale.ROOT));
this.f.remove(gameprofile);
2017-05-14 18:05:01 +00:00
@@ -137,7 +138,7 @@ public class UserCache {
}
@Nullable
- public GameProfile getProfile(String s) {
+ public synchronized GameProfile getProfile(String s) { // Paper - synchronize
String s1 = s.toLowerCase(Locale.ROOT);
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.d.get(s1);
2017-05-14 18:05:01 +00:00
@@ -166,7 +167,7 @@ public class UserCache {
return usercache_usercacheentry == null ? null : usercache_usercacheentry.a();
}
- public String[] a() {
+ public synchronized String[] a() { // Paper - synchronize
ArrayList arraylist = Lists.newArrayList(this.d.keySet());
return (String[]) arraylist.toArray(new String[arraylist.size()]);
2017-05-14 18:05:01 +00:00
@@ -228,8 +229,15 @@ public class UserCache {
}
+ // Paper start
public void c() {
+ c(true);
+ }
+ public void c(boolean asyncSave) {
+ // Paper end
String s = this.b.toJson(this.a(org.spigotmc.SpigotConfig.userCacheCap));
2016-05-23 02:20:15 +00:00
+ Runnable save = () -> {
+
BufferedWriter bufferedwriter = null;
try {
2017-05-14 18:05:01 +00:00
@@ -243,6 +251,14 @@ public class UserCache {
} finally {
IOUtils.closeQuietly(bufferedwriter);
}
+ // Paper start
2016-05-23 02:20:15 +00:00
+ };
+ if (asyncSave) {
+ MCUtil.scheduleAsyncTask(save);
+ } else {
+ save.run();
+ }
+ // Paper end
}
--
2018-01-11 05:31:19 +00:00
2.14.3