From a1c91b9007c6c2541f579e33fab51b3b864dbcc4 Mon Sep 17 00:00:00 2001 From: Luck Date: Mon, 11 May 2020 13:46:02 +0100 Subject: [PATCH] Improve sync task performance --- .../luckperms/bukkit/LPBukkitBootstrap.java | 22 +++++++++++---- .../luckperms/bungee/LPBungeeBootstrap.java | 22 +++++++++++---- .../common/commands/misc/CheckCommand.java | 2 +- .../commands/user/UserParentCommand.java | 4 +-- .../manager/user/AbstractUserManager.java | 20 ++++++-------- .../plugin/bootstrap/LuckPermsBootstrap.java | 6 ++--- .../implementation/sql/SqlStorage.java | 14 +++++++--- .../luckperms/nukkit/LPNukkitBootstrap.java | 17 ++++++++---- .../luckperms/sponge/LPSpongeBootstrap.java | 27 +++++++++++++++---- .../velocity/LPVelocityBootstrap.java | 22 +++++++++++---- 10 files changed, 109 insertions(+), 47 deletions(-) diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitBootstrap.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitBootstrap.java index c484f14c8..f2c248954 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitBootstrap.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitBootstrap.java @@ -44,10 +44,12 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin for LuckPerms running on Bukkit. @@ -254,13 +256,23 @@ public class LPBukkitBootstrap extends JavaPlugin implements LuckPermsBootstrap } @Override - public Stream getPlayerList() { - return getServer().getOnlinePlayers().stream().map(Player::getName); + public Collection getPlayerList() { + Collection players = getServer().getOnlinePlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getName()); + } + return list; } @Override - public Stream getOnlinePlayers() { - return getServer().getOnlinePlayers().stream().map(Player::getUniqueId); + public Collection getOnlinePlayers() { + Collection players = getServer().getOnlinePlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getUniqueId()); + } + return list; } @Override diff --git a/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeeBootstrap.java b/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeeBootstrap.java index d18b0398c..fe0b56c62 100644 --- a/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeeBootstrap.java +++ b/bungee/src/main/java/me/lucko/luckperms/bungee/LPBungeeBootstrap.java @@ -43,10 +43,12 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin for LuckPerms running on BungeeCord. @@ -249,13 +251,23 @@ public class LPBungeeBootstrap extends Plugin implements LuckPermsBootstrap { } @Override - public Stream getPlayerList() { - return getProxy().getPlayers().stream().map(ProxiedPlayer::getName); + public Collection getPlayerList() { + Collection players = getProxy().getPlayers(); + List list = new ArrayList<>(players.size()); + for (ProxiedPlayer player : players) { + list.add(player.getName()); + } + return list; } @Override - public Stream getOnlinePlayers() { - return getProxy().getPlayers().stream().map(ProxiedPlayer::getUniqueId); + public Collection getOnlinePlayers() { + Collection players = getProxy().getPlayers(); + List list = new ArrayList<>(players.size()); + for (ProxiedPlayer player : players) { + list.add(player.getUniqueId()); + } + return list; } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/CheckCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/CheckCommand.java index 0f9f54284..fb327a227 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/CheckCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/CheckCommand.java @@ -78,7 +78,7 @@ public class CheckCommand extends SingleCommand { @Override public List tabComplete(LuckPermsPlugin plugin, Sender sender, List args) { return TabCompleter.create() - .at(0, CompletionSupplier.startsWith(() -> plugin.getBootstrap().getPlayerList())) + .at(0, CompletionSupplier.startsWith(() -> plugin.getBootstrap().getPlayerList().stream())) .at(1, TabCompletions.permissions(plugin)) .complete(args); } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserParentCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserParentCommand.java index 5989490a0..08a002f30 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/user/UserParentCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/user/UserParentCommand.java @@ -49,11 +49,11 @@ import me.lucko.luckperms.common.storage.misc.DataConstraints; import me.lucko.luckperms.common.util.CaffeineFactory; import me.lucko.luckperms.common.util.Uuids; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; -import java.util.stream.Collectors; public class UserParentCommand extends ParentCommand { @@ -144,6 +144,6 @@ public class UserParentCommand extends ParentCommand { @Override protected List getTargets(LuckPermsPlugin plugin) { - return plugin.getBootstrap().getPlayerList().collect(Collectors.toList()); + return new ArrayList<>(plugin.getBootstrap().getPlayerList()); } } \ No newline at end of file diff --git a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java index 9c10c0734..7f19ba5ae 100644 --- a/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/model/manager/user/AbstractUserManager.java @@ -34,20 +34,18 @@ import me.lucko.luckperms.common.model.manager.AbstractManager; import me.lucko.luckperms.common.model.manager.group.GroupManager; import me.lucko.luckperms.common.node.types.Inheritance; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; -import me.lucko.luckperms.common.util.Iterators; import me.lucko.luckperms.common.verbose.event.MetaCheckEvent; import net.luckperms.api.model.data.DataType; import net.luckperms.api.node.Node; import net.luckperms.api.node.types.InheritanceNode; +import java.util.HashSet; import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.stream.Stream; public abstract class AbstractUserManager extends AbstractManager implements UserManager { @@ -137,16 +135,14 @@ public abstract class AbstractUserManager extends AbstractManage @Override public CompletableFuture loadAllUsers() { - Set ids = Stream.concat( - getAll().keySet().stream(), - this.plugin.getBootstrap().getOnlinePlayers() - ).collect(Collectors.toSet()); + Set ids = new HashSet<>(getAll().keySet()); + ids.addAll(this.plugin.getBootstrap().getOnlinePlayers()); - return CompletableFuture.runAsync(() -> { - Iterators.tryIterate(ids, id -> { - this.plugin.getStorage().loadUser(id, null).join(); - }); - }, this.plugin.getBootstrap().getScheduler().async()); + CompletableFuture[] loadTasks = ids.stream() + .map(id -> this.plugin.getStorage().loadUser(id, null)) + .toArray(CompletableFuture[]::new); + + return CompletableFuture.allOf(loadTasks); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java b/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java index 727454c1b..4d18a1528 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/bootstrap/LuckPermsBootstrap.java @@ -36,12 +36,12 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin interface @@ -197,14 +197,14 @@ public interface LuckPermsBootstrap { * * @return a {@link List} of usernames */ - Stream getPlayerList(); + Collection getPlayerList(); /** * Gets the UUIDs of the users online on the platform * * @return a {@link Set} of UUIDs */ - Stream getOnlinePlayers(); + Collection getOnlinePlayers(); /** * Checks if a user is online diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java index 220c1ed97..3c67a7d5c 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/implementation/sql/SqlStorage.java @@ -43,7 +43,6 @@ import me.lucko.luckperms.common.storage.implementation.StorageImplementation; import me.lucko.luckperms.common.storage.implementation.sql.connection.ConnectionFactory; import me.lucko.luckperms.common.storage.misc.NodeEntry; import me.lucko.luckperms.common.storage.misc.PlayerSaveResultImpl; -import me.lucko.luckperms.common.util.Iterators; import me.lucko.luckperms.common.util.gson.GsonProvider; import net.luckperms.api.actionlog.Action; @@ -584,10 +583,17 @@ public class SqlStorage implements StorageImplementation { Set tracks; try (Connection c = this.connectionFactory.getConnection()) { tracks = selectTracks(c); - } - if (!Iterators.tryIterate(tracks, this::loadTrack)) { - throw new RuntimeException("Exception occurred whilst loading a track"); + for (String trackName : tracks) { + Track track = this.plugin.getTrackManager().getOrMake(trackName); + track.getIoLock().lock(); + try { + List groups = selectTrack(c, trackName); + track.setGroups(groups); + } finally { + track.getIoLock().unlock(); + } + } } this.plugin.getTrackManager().retainAll(tracks); diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitBootstrap.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitBootstrap.java index 4f7c8f652..9920d0134 100644 --- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitBootstrap.java +++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitBootstrap.java @@ -38,10 +38,12 @@ import cn.nukkit.plugin.PluginBase; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin for LuckPerms running on Nukkit. @@ -201,13 +203,18 @@ public class LPNukkitBootstrap extends PluginBase implements LuckPermsBootstrap } @Override - public Stream getPlayerList() { - return getServer().getOnlinePlayers().values().stream().map(Player::getName); + public Collection getPlayerList() { + Collection players = getServer().getOnlinePlayers().values(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getName()); + } + return list; } @Override - public Stream getOnlinePlayers() { - return getServer().getOnlinePlayers().values().stream().map(Player::getUniqueId); + public Collection getOnlinePlayers() { + return new ArrayList<>(getServer().getOnlinePlayers().keySet()); } @Override diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongeBootstrap.java b/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongeBootstrap.java index d59d89eed..095c035a2 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongeBootstrap.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/LPSpongeBootstrap.java @@ -59,10 +59,13 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin for LuckPerms running on Sponge. @@ -297,13 +300,27 @@ public class LPSpongeBootstrap implements LuckPermsBootstrap { } @Override - public Stream getPlayerList() { - return getServer().map(server -> server.getOnlinePlayers().stream().map(Player::getName)).orElseGet(Stream::empty); + public Collection getPlayerList() { + return getServer().map(server -> { + Collection players = server.getOnlinePlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getName()); + } + return list; + }).orElse(Collections.emptyList()); } @Override - public Stream getOnlinePlayers() { - return getServer().map(server -> server.getOnlinePlayers().stream().map(Player::getUniqueId)).orElseGet(Stream::empty); + public Collection getOnlinePlayers() { + return getServer().map(server -> { + Collection players = server.getOnlinePlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getUniqueId()); + } + return list; + }).orElse(Collections.emptyList()); } @Override diff --git a/velocity/src/main/java/me/lucko/luckperms/velocity/LPVelocityBootstrap.java b/velocity/src/main/java/me/lucko/luckperms/velocity/LPVelocityBootstrap.java index ffeba5fc1..3a264f8d6 100644 --- a/velocity/src/main/java/me/lucko/luckperms/velocity/LPVelocityBootstrap.java +++ b/velocity/src/main/java/me/lucko/luckperms/velocity/LPVelocityBootstrap.java @@ -48,10 +48,12 @@ import org.slf4j.Logger; import java.io.InputStream; import java.nio.file.Path; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.stream.Stream; /** * Bootstrap plugin for LuckPerms running on Velocity. @@ -226,13 +228,23 @@ public class LPVelocityBootstrap implements LuckPermsBootstrap { } @Override - public Stream getPlayerList() { - return this.proxy.getAllPlayers().stream().map(Player::getUsername); + public Collection getPlayerList() { + Collection players = this.proxy.getAllPlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getUsername()); + } + return list; } @Override - public Stream getOnlinePlayers() { - return this.proxy.getAllPlayers().stream().map(Player::getUniqueId); + public Collection getOnlinePlayers() { + Collection players = this.proxy.getAllPlayers(); + List list = new ArrayList<>(players.size()); + for (Player player : players) { + list.add(player.getUniqueId()); + } + return list; } @Override