From d8804be65878a59f4cca1cd197da42a106c6d80e Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Thu, 26 Feb 2015 18:38:58 -0800 Subject: [PATCH] Player names cache to another thread. Should improve boot speed a lot for large / old servers. --- .../GriefPrevention/GriefPrevention.java | 79 +++++++++++-------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index 45db081..01a0cb3 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -315,37 +315,11 @@ public class GriefPrevention extends JavaPlugin } } - int playersCached = 0; + //cache offline players OfflinePlayer [] offlinePlayers = this.getServer().getOfflinePlayers(); - long now = System.currentTimeMillis(); - final long millisecondsPerDay = 1000 * 60 * 60 * 24; - for(OfflinePlayer player : offlinePlayers) - { - try - { - UUID playerID = player.getUniqueId(); - if(playerID == null) continue; - long lastSeen = player.getLastPlayed(); - - //if the player has been seen in the last 30 days, cache his name/UUID pair - long diff = now - lastSeen; - long daysDiff = diff / millisecondsPerDay; - if(daysDiff <= 30) - { - String playerName = player.getName(); - if(playerName == null) continue; - this.playerNameToIDMap.put(playerName, playerID); - this.playerNameToIDMap.put(playerName.toLowerCase(), playerID); - playersCached++; - } - } - catch(Exception e) - { - e.printStackTrace(); - } - } - - AddLogEntry("Cached " + playersCached + " recent players."); + CacheOfflinePlayerNamesThread namesThread = new CacheOfflinePlayerNamesThread(offlinePlayers, this.playerNameToIDMap); + namesThread.setPriority(Thread.MIN_PRIORITY); + namesThread.start(); AddLogEntry("Boot finished."); } @@ -2275,7 +2249,50 @@ public class GriefPrevention extends JavaPlugin //helper method to resolve a player by name ConcurrentHashMap playerNameToIDMap = new ConcurrentHashMap(); - private OfflinePlayer resolvePlayerByName(String name) + //thread to build the above cache + private class CacheOfflinePlayerNamesThread extends Thread + { + private OfflinePlayer [] offlinePlayers; + private ConcurrentHashMap playerNameToIDMap; + + CacheOfflinePlayerNamesThread(OfflinePlayer [] offlinePlayers, ConcurrentHashMap playerNameToIDMap) + { + this.offlinePlayers = offlinePlayers; + this.playerNameToIDMap = playerNameToIDMap; + } + + public void run() + { + long now = System.currentTimeMillis(); + final long millisecondsPerDay = 1000 * 60 * 60 * 24; + for(OfflinePlayer player : offlinePlayers) + { + try + { + UUID playerID = player.getUniqueId(); + if(playerID == null) continue; + long lastSeen = player.getLastPlayed(); + + //if the player has been seen in the last 30 days, cache his name/UUID pair + long diff = now - lastSeen; + long daysDiff = diff / millisecondsPerDay; + if(daysDiff <= 30) + { + String playerName = player.getName(); + if(playerName == null) continue; + this.playerNameToIDMap.put(playerName, playerID); + this.playerNameToIDMap.put(playerName.toLowerCase(), playerID); + } + } + catch(Exception e) + { + e.printStackTrace(); + } + } + } + } + + private OfflinePlayer resolvePlayerByName(String name) { //try online players first Player targetPlayer = this.getServer().getPlayerExact(name);