From 8caa8350caf21f9e96416e7fe1e657e7aa4e0df3 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Thu, 21 Feb 2019 21:24:20 +0200 Subject: [PATCH] Fix nickname cache call blocking server thread --- .../system/listeners/bukkit/ChatListener.java | 11 ++++------ .../bukkit/PlayerOnlineListener.java | 9 ++++---- .../events/NicknameStoreTransaction.java | 10 ++++++++- .../plan/system/cache/NicknameCache.java | 12 ----------- .../com/djrapitops/plan/db/CommonDBTest.java | 12 +++++------ .../listeners/sponge/SpongeChatListener.java | 11 ++++------ .../sponge/SpongePlayerListener.java | 21 +++++++++---------- 7 files changed, 37 insertions(+), 49 deletions(-) diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java index 9733bde48..2cb5c0d1e 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/ChatListener.java @@ -76,12 +76,9 @@ public class ChatListener implements Listener { UUID uuid = player.getUniqueId(); String displayName = player.getDisplayName(); - if (displayName.equals(nicknameCache.getDisplayName(uuid))) { - return; - } - - dbSystem.getDatabase().executeTransaction( - new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID())) - ); + dbSystem.getDatabase().executeTransaction(new NicknameStoreTransaction( + uuid, new Nickname(displayName, time, serverInfo.getServerUUID()), + (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID)) + )); } } diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java index 755a7c759..a9cbdb2d3 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/listeners/bukkit/PlayerOnlineListener.java @@ -167,11 +167,10 @@ public class PlayerOnlineListener implements Listener { sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm)) .ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession))); - if (!displayName.equals(nicknameCache.getDisplayName(uuid))) { - database.executeTransaction( - new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverUUID)) - ); - } + database.executeTransaction(new NicknameStoreTransaction( + uuid, new Nickname(displayName, time, serverUUID), + (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID)) + )); processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid)); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java index 93bfe3ab5..41e3d6a85 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/db/access/transactions/events/NicknameStoreTransaction.java @@ -21,6 +21,7 @@ import com.djrapitops.plan.db.access.queries.DataStoreQueries; import com.djrapitops.plan.db.access.transactions.Transaction; import java.util.UUID; +import java.util.function.BiPredicate; /** * Transaction to store player's nickname information in the database. @@ -31,10 +32,17 @@ public class NicknameStoreTransaction extends Transaction { private final UUID playerUUID; private final Nickname nickname; + private final BiPredicate isNicknameCachedCheck; - public NicknameStoreTransaction(UUID playerUUID, Nickname nickname) { + public NicknameStoreTransaction(UUID playerUUID, Nickname nickname, BiPredicate isNicknameCachedCheck) { this.playerUUID = playerUUID; this.nickname = nickname; + this.isNicknameCachedCheck = isNicknameCachedCheck; + } + + @Override + protected boolean shouldBeExecuted() { + return !isNicknameCachedCheck.test(playerUUID, nickname.getName()); } @Override diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/cache/NicknameCache.java b/Plan/common/src/main/java/com/djrapitops/plan/system/cache/NicknameCache.java index 0b33c644d..b793ec7fe 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/cache/NicknameCache.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/cache/NicknameCache.java @@ -68,18 +68,6 @@ public class NicknameCache implements SubSystem { displayNames.clear(); } - /** - * Used to update PlayerName and DisplayName caches. - * - * @param uuid UUID of the player. - * @param displayName DisplayName of the player. - */ - public void updateDisplayName(UUID uuid, String displayName) { - if (displayName != null) { - displayNames.put(uuid, displayName); - } - } - public void removeDisplayName(UUID uuid) { displayNames.remove(uuid); } diff --git a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java index 66c0f2a49..d8a5c6c8c 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/db/CommonDBTest.java @@ -259,8 +259,8 @@ public abstract class CommonDBTest { saveUserOne(); Nickname expected = new Nickname("TestNickname", System.currentTimeMillis(), serverUUID); - db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected)); - db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected)); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected, (uuid, name) -> false /* Not cached */)); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, expected, (uuid, name) -> true /* Cached */)); commitTest(); List nicknames = db.query(NicknameQueries.fetchNicknameDataOfPlayer(playerUUID)); @@ -472,7 +472,7 @@ public abstract class CommonDBTest { session.setPlayerKills(createKills()); execute(DataStoreQueries.storeSession(session)); - db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID))); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID), (uuid, name) -> false /* Not cached */)); saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, "3")); assertTrue(db.query(PlayerFetchQueries.isPlayerRegistered(playerUUID))); @@ -522,7 +522,7 @@ public abstract class CommonDBTest { execute(DataStoreQueries.storeSession(session)); db.executeTransaction( - new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID)) + new NicknameStoreTransaction(playerUUID, new Nickname("TestNick", System.currentTimeMillis(), serverUUID), (uuid, name) -> false /* Not cached */) ); saveGeoInfo(playerUUID, new GeoInfo("1.2.3.4", "TestLoc", 223456789L, new SHA256Hash("1.2.3.4").create())); @@ -953,8 +953,8 @@ public abstract class CommonDBTest { db.executeTransaction(new PlayerRegisterTransaction(playerUUID, () -> 1L, "Not random")); String nickname = "2" + RandomData.randomString(10); - db.executeTransaction(new NicknameStoreTransaction(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID))); - db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID))); + db.executeTransaction(new NicknameStoreTransaction(uuid, new Nickname(nickname, System.currentTimeMillis(), serverUUID), (u, name) -> false /* Not cached */)); + db.executeTransaction(new NicknameStoreTransaction(playerUUID, new Nickname("No nick", System.currentTimeMillis(), serverUUID), (u, name) -> true /* Cached */)); String searchFor = "2"; diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java index 1b1087075..3a29fb15d 100644 --- a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java +++ b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeChatListener.java @@ -75,12 +75,9 @@ public class SpongeChatListener { UUID uuid = player.getUniqueId(); String displayName = player.getDisplayNameData().displayName().get().toPlain(); - if (displayName.equals(nicknameCache.getDisplayName(uuid))) { - return; - } - - dbSystem.getDatabase().executeTransaction( - new NicknameStoreTransaction(uuid, new Nickname(displayName, time, serverInfo.getServerUUID())) - ); + dbSystem.getDatabase().executeTransaction(new NicknameStoreTransaction( + uuid, new Nickname(displayName, time, serverInfo.getServerUUID()), + (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID)) + )); } } \ No newline at end of file diff --git a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java index ec86a628f..01546d0dc 100644 --- a/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java +++ b/Plan/sponge/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongePlayerListener.java @@ -142,11 +142,11 @@ public class SpongePlayerListener { private void actOnJoinEvent(ClientConnectionEvent.Join event) { Player player = event.getTargetEntity(); - UUID playerUUID = player.getUniqueId(); + UUID uuid = player.getUniqueId(); UUID serverUUID = serverInfo.getServerUUID(); long time = System.currentTimeMillis(); - SpongeAFKListener.AFK_TRACKER.performedAction(playerUUID, time); + SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time); String world = player.getWorld().getName(); Optional gameMode = player.getGameModeData().get(Keys.GAME_MODE); @@ -163,21 +163,20 @@ public class SpongePlayerListener { boolean gatheringGeolocations = config.isTrue(DataGatheringSettings.GEOLOCATIONS); if (gatheringGeolocations) { database.executeTransaction( - new GeoInfoStoreTransaction(playerUUID, address, time, geolocationCache::getCountry) + new GeoInfoStoreTransaction(uuid, address, time, geolocationCache::getCountry) ); } - database.executeTransaction(new PlayerServerRegisterTransaction(playerUUID, () -> time, playerName, serverUUID)); - sessionCache.cacheSession(playerUUID, new Session(playerUUID, serverUUID, time, world, gm)) + database.executeTransaction(new PlayerServerRegisterTransaction(uuid, () -> time, playerName, serverUUID)); + sessionCache.cacheSession(uuid, new Session(uuid, serverUUID, time, world, gm)) .ifPresent(previousSession -> database.executeTransaction(new SessionEndTransaction(previousSession))); - if (!displayName.equals(nicknameCache.getDisplayName(playerUUID))) { - database.executeTransaction( - new NicknameStoreTransaction(playerUUID, new Nickname(displayName, time, serverUUID)) - ); - } + database.executeTransaction(new NicknameStoreTransaction( + uuid, new Nickname(displayName, time, serverUUID), + (playerUUID, name) -> name.equals(nicknameCache.getDisplayName(playerUUID)) + )); - processing.submitNonCritical(processors.info().playerPageUpdateProcessor(playerUUID)); + processing.submitNonCritical(processors.info().playerPageUpdateProcessor(uuid)); } @Listener(order = Order.POST)