From b7774251eb1015aca208ffdc7491926c3baf5764 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Tue, 5 Aug 2014 23:02:41 -0400 Subject: [PATCH] Remove need for thread locks in profile loading, just reschedule as needed. also stagger based on number of previous attempts. --- .../database/ConvertDatabaseCommand.java | 2 +- .../experience/ConvertExperienceCommand.java | 2 +- .../nossr50/listeners/PlayerListener.java | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 2 +- .../player/PlayerProfileLoadingTask.java | 65 +++++++------------ .../java/com/gmail/nossr50/util/Misc.java | 2 +- 6 files changed, 28 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java index eae0fd492..53fef1073 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/ConvertDatabaseCommand.java @@ -62,7 +62,7 @@ public class ConvertDatabaseCommand implements CommandExecutor { mcMMO.getDatabaseManager().saveUser(profile); } - new PlayerProfileLoadingTask(player).runTaskTimerAsynchronously(mcMMO.p, 1, 100); // 1 Tick delay to ensure the player is marked as online before we begin loading + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading } new DatabaseConversionTask(oldDatabase, sender, previousType.toString(), newType.toString()).runTaskAsynchronously(mcMMO.p); diff --git a/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java b/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java index 31cb4172f..298bc3465 100644 --- a/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/experience/ConvertExperienceCommand.java @@ -38,7 +38,7 @@ public class ConvertExperienceCommand implements CommandExecutor { new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { - new PlayerProfileLoadingTask(player).runTaskTimerAsynchronously(mcMMO.p, 1, 100); // 1 Tick delay to ensure the player is marked as online before we begin loading + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading } return true; diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 93bc012ed..771fe4f87 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -387,7 +387,7 @@ public class PlayerListener implements Listener { return; } - new PlayerProfileLoadingTask(player).runTaskTimerAsynchronously(mcMMO.p, 1, 100); // 1 Tick delay to ensure the player is marked as online before we begin loading + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading if (Config.getInstance().getMOTDEnabled() && Permissions.motd(player)) { Motd.displayAll(player); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 95d31a0c3..3a3168f6b 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -168,7 +168,7 @@ public class mcMMO extends JavaPlugin { holidayManager = new HolidayManager(); for (Player player : getServer().getOnlinePlayers()) { - new PlayerProfileLoadingTask(player).runTaskTimerAsynchronously(mcMMO.p, 1, 100); // 1 Tick delay to ensure the player is marked as online before we begin loading + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading } debug("Version " + getDescription().getVersion() + " is enabled!"); diff --git a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java index 709f563f9..a33ff97ba 100644 --- a/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/player/PlayerProfileLoadingTask.java @@ -1,7 +1,5 @@ package com.gmail.nossr50.runnables.player; -import java.util.concurrent.locks.ReentrantLock; - import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -20,8 +18,6 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { private static final int MAX_TRIES = 5; private final Player player; private int attempt = 0; - private ReentrantLock lock = new ReentrantLock(); - private boolean cancelled = false; public PlayerProfileLoadingTask(Player player) { this.player = player; @@ -31,45 +27,30 @@ public class PlayerProfileLoadingTask extends BukkitRunnable { // DO NOT MODIFY THE McMMOPLAYER FROM THIS CODE @Override public void run() { - lock.lock(); - - try { - if (this.cancelled) { - return; - } - - // Quit if they logged out - if (!player.isOnline()) { - mcMMO.p.getLogger().info("Aborting profile loading recovery for " + player.getName() + " - player logged out"); - this.cancel(); - cancelled = true; - return; - } - - // Increment attempt counter and try - attempt++; - - PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getName(), player.getUniqueId(), true); - // If successful, schedule the apply - if (profile.isLoaded()) { - new ApplySuccessfulProfile(profile).runTask(mcMMO.p); - this.cancel(); - cancelled = true; - return; - } - - // If we've failed five times, give up - if (attempt >= MAX_TRIES) { - mcMMO.p.getLogger().severe("Giving up on attempting to load the PlayerProfile for " + player.getName()); - mcMMO.p.getServer().broadcast(LocaleLoader.getString("Profile.Loading.AdminFailureNotice", player.getName()), Server.BROADCAST_CHANNEL_ADMINISTRATIVE); - player.sendMessage(LocaleLoader.getString("Profile.Loading.Failure").split("\n")); - this.cancel(); - cancelled = true; - return; - } - } finally { - lock.unlock(); + // Quit if they logged out + if (!player.isOnline()) { + mcMMO.p.getLogger().info("Aborting profile loading recovery for " + player.getName() + " - player logged out"); + return; } + + // Increment attempt counter and try + attempt++; + + PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(player.getName(), player.getUniqueId(), true); + // If successful, schedule the apply + if (profile.isLoaded()) { + new ApplySuccessfulProfile(profile).runTask(mcMMO.p); + return; + } + + // If we've failed five times, give up + if (attempt >= MAX_TRIES) { + mcMMO.p.getLogger().severe("Giving up on attempting to load the PlayerProfile for " + player.getName()); + mcMMO.p.getServer().broadcast(LocaleLoader.getString("Profile.Loading.AdminFailureNotice", player.getName()), Server.BROADCAST_CHANNEL_ADMINISTRATIVE); + player.sendMessage(LocaleLoader.getString("Profile.Loading.Failure").split("\n")); + return; + } + this.runTaskLaterAsynchronously(mcMMO.p, 100 * attempt); } private class ApplySuccessfulProfile extends BukkitRunnable { diff --git a/src/main/java/com/gmail/nossr50/util/Misc.java b/src/main/java/com/gmail/nossr50/util/Misc.java index cf10c754f..6a21339cc 100644 --- a/src/main/java/com/gmail/nossr50/util/Misc.java +++ b/src/main/java/com/gmail/nossr50/util/Misc.java @@ -113,7 +113,7 @@ public final class Misc { if (player != null) { UserManager.remove(player); - new PlayerProfileLoadingTask(player).runTaskTimerAsynchronously(mcMMO.p, 1, 100); // 1 Tick delay to ensure the player is marked as online before we begin loading + new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading } }