Browse Source

Remove need for thread locks in profile loading, just reschedule as needed. also stagger based on number of previous attempts.

t00thpick1 11 years ago
parent
commit
b7774251eb

+ 1 - 1
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);

+ 1 - 1
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;

+ 1 - 1
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);

+ 1 - 1
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!");

+ 20 - 39
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;
-            }
+        // 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++;
+        // 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;
-            }
+        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"));
-                this.cancel();
-                cancelled = true;
-                return;
-            }
-        } finally {
-            lock.unlock();
+        // 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 {

+ 1 - 1
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
         }
     }