From af95e8076538d1aa0b02d2a20c975f7b7e11abfd Mon Sep 17 00:00:00 2001 From: William Date: Tue, 26 Oct 2021 13:32:49 +0100 Subject: [PATCH] Fix for a ConcurrentModificationException that can occur during the data save process --- .../listener/BungeeRedisListener.java | 2 +- .../bungeecord/migrator/MPDBMigrator.java | 30 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/bungeecord/src/main/java/me/william278/husksync/bungeecord/listener/BungeeRedisListener.java b/bungeecord/src/main/java/me/william278/husksync/bungeecord/listener/BungeeRedisListener.java index 7403cbfc..06c82d91 100644 --- a/bungeecord/src/main/java/me/william278/husksync/bungeecord/listener/BungeeRedisListener.java +++ b/bungeecord/src/main/java/me/william278/husksync/bungeecord/listener/BungeeRedisListener.java @@ -172,7 +172,7 @@ public class BungeeRedisListener extends RedisListener { // When all the data has been received, save it if (MPDBMigrator.migratedDataSent == MPDBMigrator.playersMigrated) { - MPDBMigrator.loadIncomingData(); + MPDBMigrator.loadIncomingData(MPDBMigrator.incomingPlayerData); } } } diff --git a/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java b/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java index ab551aaa..374a16d5 100644 --- a/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java +++ b/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java @@ -33,7 +33,7 @@ public class MPDBMigrator { private static final HuskSyncBungeeCord plugin = HuskSyncBungeeCord.getInstance(); - public static HashMap incomingPlayerData; + public static HashMap incomingPlayerData; public static MigrationSettings migrationSettings = new MigrationSettings(); private static Database sourceDatabase; @@ -198,15 +198,17 @@ public class MPDBMigrator { } /** - * Load all incoming decoded MPDB data to cache / SQL + * Loads all incoming decoded MPDB data to the cache and database + * + * @param dataToLoad HashMap of the {@link PlayerData} to player Usernames that will be loaded */ - public static void loadIncomingData() { + public static void loadIncomingData(HashMap dataToLoad) { ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> { int playersSaved = 0; plugin.getLogger().log(Level.INFO, "Saving data for " + playersMigrated + " players..."); - for (PlayerData playerData : incomingPlayerData.keySet()) { - String playerName = incomingPlayerData.get(playerData); + for (PlayerData playerData : dataToLoad.keySet()) { + String playerName = dataToLoad.get(playerData); // Add the player to the MySQL table DataManager.ensurePlayerExists(playerData.getPlayerUUID(), playerName); @@ -220,15 +222,15 @@ public class MPDBMigrator { // Mark as done when done plugin.getLogger().log(Level.INFO, """ - === MySQLPlayerDataBridge Migration Wizard ========== - - Migration complete! - - Successfully migrated data for %1%/%2% players. - - You should now uninstall MySQLPlayerDataBridge from - the rest of the Spigot servers, then restart them. - """.replaceAll("%1%", Integer.toString(MPDBMigrator.playersMigrated)) + === MySQLPlayerDataBridge Migration Wizard ========== + + Migration complete! + + Successfully migrated data for %1%/%2% players. + + You should now uninstall MySQLPlayerDataBridge from + the rest of the Spigot servers, then restart them. + """.replaceAll("%1%", Integer.toString(MPDBMigrator.playersMigrated)) .replaceAll("%2%", Integer.toString(MPDBMigrator.migratedDataSent))); sourceDatabase.close(); // Close source database });