aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0279-Async-command-map-building.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0279-Async-command-map-building.patch')
-rw-r--r--patches/server/0279-Async-command-map-building.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/patches/server/0279-Async-command-map-building.patch b/patches/server/0279-Async-command-map-building.patch
new file mode 100644
index 0000000000..370fccd4b4
--- /dev/null
+++ b/patches/server/0279-Async-command-map-building.patch
@@ -0,0 +1,66 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Callahan <[email protected]>
+Date: Wed, 8 Apr 2020 02:42:14 -0500
+Subject: [PATCH] Async command map building
+
+This adds a custom pool inorder to make sure that they are closed
+without much though, as it doesn't matter if the client is not sent
+commands if the server is restarting. Using the default async pool caused issues to arise
+due to the shutdown logic generally being much later.
+
+diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
+index eec5279ac4386132fa053c57889e32e6b8141614..b754c0b3e2cd878fca5f702daca64f837ec83451 100644
+--- a/src/main/java/net/minecraft/commands/Commands.java
++++ b/src/main/java/net/minecraft/commands/Commands.java
+@@ -452,6 +452,24 @@ public class Commands {
+ if ( org.spigotmc.SpigotConfig.tabComplete < 0 ) return; // Spigot
+ // CraftBukkit start
+ // Register Vanilla commands into builtRoot as before
++ // Paper start - Perf: Async command map building
++ COMMAND_SENDING_POOL.execute(() -> {
++ this.sendAsync(player);
++ });
++ }
++
++ public static final java.util.concurrent.ThreadPoolExecutor COMMAND_SENDING_POOL = new java.util.concurrent.ThreadPoolExecutor(
++ 0, 2, 60L, java.util.concurrent.TimeUnit.SECONDS,
++ new java.util.concurrent.LinkedBlockingQueue<>(),
++ new com.google.common.util.concurrent.ThreadFactoryBuilder()
++ .setNameFormat("Paper Async Command Builder Thread Pool - %1$d")
++ .setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER))
++ .build(),
++ new java.util.concurrent.ThreadPoolExecutor.DiscardPolicy()
++ );
++
++ private void sendAsync(ServerPlayer player) {
++ // Paper end - Perf: Async command map building
+ Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> map = Maps.newIdentityHashMap(); // Use identity to prevent aliasing issues
+ RootCommandNode vanillaRoot = new RootCommandNode();
+
+@@ -469,7 +487,14 @@ public class Commands {
+ for (CommandNode node : rootcommandnode.getChildren()) {
+ bukkit.add(node.getName());
+ }
++ // Paper start - Perf: Async command map building
++ net.minecraft.server.MinecraftServer.getServer().execute(() -> {
++ runSync(player, bukkit, rootcommandnode);
++ });
++ }
+
++ private void runSync(ServerPlayer player, Collection<String> bukkit, RootCommandNode<SharedSuggestionProvider> rootcommandnode) {
++ // Paper end - Perf: Async command map building
+ PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit));
+ event.getPlayer().getServer().getPluginManager().callEvent(event);
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index c543a7e7ef3b26ab610811448b8091894a0a36d5..043dbf59effbbddc5b2e3b8837717997a1771e6f 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -924,6 +924,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ }
+
+ MinecraftServer.LOGGER.info("Stopping server");
++ Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing
+ MinecraftTimings.stopServer(); // Paper
+ // CraftBukkit start
+ if (this.server != null) {