diff --git a/patches/server/0014-Suki-Patches.patch b/patches/server/0014-Suki-Patches.patch index cd1f5a8..8ab035a 100644 --- a/patches/server/0014-Suki-Patches.patch +++ b/patches/server/0014-Suki-Patches.patch @@ -11,6 +11,7 @@ You can find the original code on https://github.com/SuCraft/Suki 0016-Send-more-packets-immediately.patch 0017-Flush-after-more-packets.patch 0018-Do-not-relocate-corrupted-chunks.patch +0015-Multithreading environment variables.patch diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java index 2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31..991b06836df310913a14ce1c60979a2c2944b0e5 100644 @@ -226,6 +227,56 @@ index e731de3ac158c5a4cff236c6f5001674cd488a77..06a6cecfa01c676285ea894c3ed77d0e + } + // Suki end - Suki configuration } +diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java +index b759f82b265542f42821e35ead56a5c073625d36..f93cbf0812801bb503db26e623d988e4eeb8b126 100644 +--- a/src/main/java/net/minecraft/Util.java ++++ b/src/main/java/net/minecraft/Util.java +@@ -27,7 +27,6 @@ import java.net.URL; + import java.nio.file.Files; + import java.nio.file.Path; + import java.nio.file.spi.FileSystemProvider; +-import java.security.AccessController; + import java.security.PrivilegedActionException; + import java.security.PrivilegedExceptionAction; + import java.time.Duration; +@@ -151,9 +150,15 @@ public class Util { + } + + private static ExecutorService makeExecutor(String s, int priorityModifier) { // Paper - add priority ++ // Suki start - multithreading environment variables ++ return makeExecutor(s, priorityModifier, -1); ++ } ++ ++ public static ExecutorService makeExecutor(String s, int priorityModifier, int specificThreads) { ++ // Suki end - multithreading environment variables + // Paper start - use simpler thread pool that allows 1 thread + // Paper start - also try to avoid suffocating the system with the worldgen workers +- int cpus = Runtime.getRuntime().availableProcessors() / 2; ++ int cpus = Integer.getInteger("suki.systemcpus.forexecutors", Runtime.getRuntime().availableProcessors() / 2); // Suki - multithreading environment variables + int i; + if (cpus <= 4) { + i = cpus <= 2 ? 1 : 2; +@@ -166,6 +171,11 @@ public class Util { + i = Math.min(8, i); + // Paper end - also try to avoid suffocating the system with the worldgen workers + i = Integer.getInteger("Paper.WorkerThreadCount", i); ++ // Suki start - multithreading environment variables ++ if (specificThreads > 0) { ++ i = specificThreads; ++ } ++ // Suki end - multithreading environment variables + ExecutorService executorService; + + if (i <= 0) { +@@ -173,7 +183,7 @@ public class Util { + } else { + //executorService = new java.util.concurrent.ThreadPoolExecutor(i, i,0L, TimeUnit.MILLISECONDS, new java.util.concurrent.LinkedBlockingQueue(), target -> new net.minecraft.server.ServerWorkerThread(target, s, priorityModifier)); // JettPack + // JettPack start +- executorService = Integer.getInteger("Paper.WorkerThreadCount", i) <= 0 ? MoreExecutors.newDirectExecutorService() : new AbstractExecutorService(){ ++ executorService = new AbstractExecutorService(){ // Suki - multithreading environment variables + private volatile boolean shutdown = false; + + @Override diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java index e1563410e0711de5cf9363978125e637929392da..948e988cdcf3edb0ceb0bd397d0579a1784d9ae1 100644 --- a/src/main/java/net/minecraft/network/Connection.java @@ -260,8 +311,36 @@ index e1563410e0711de5cf9363978125e637929392da..948e988cdcf3edb0ceb0bd397d0579a1 // Paper end - add flush parameter ConnectionProtocol enumprotocol = ConnectionProtocol.getProtocolForPacket(packet); ConnectionProtocol enumprotocol1 = this.getCurrentProtocol(); +diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java +index 07b0b0993c01763b39d1c9a387447ec76b5de190..72e700a775403eec2d1a32859279401351b836b1 100644 +--- a/src/main/java/net/minecraft/server/MCUtil.java ++++ b/src/main/java/net/minecraft/server/MCUtil.java +@@ -55,8 +55,8 @@ import java.util.function.Supplier; + + public final class MCUtil { + public static final ThreadPoolExecutor asyncExecutor = new ThreadPoolExecutor( +- 0, 2, 60L, TimeUnit.SECONDS, +- new LinkedBlockingQueue<>(), ++ Integer.getInteger("suki.threads.asyncexecutor", 4), Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, // JettPack // Suki - multithreading environment variables ++ new LinkedBlockingQueue<>(), + new ThreadFactoryBuilder() + .setNameFormat("Paper Async Task Handler Thread - %1$d") + .setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(MinecraftServer.LOGGER)) +diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java +index 5962f7a2b185d7d54a0f9e341a4fdf6e6f1c1ec5..8c80520396bc7e34bac25354c1fcdb38b71000c7 100644 +--- a/src/main/java/net/minecraft/server/Main.java ++++ b/src/main/java/net/minecraft/server/Main.java +@@ -318,7 +318,7 @@ public class Main { + // Paper start - fix and optimise world upgrading + public static void convertWorldButItWorks(net.minecraft.resources.ResourceKey dimensionType, net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess worldSession, + DataFixer dataFixer, Optional>> generatorKey, boolean removeCaches) { +- int threads = Runtime.getRuntime().availableProcessors() * 3 / 8; ++ int threads = Integer.getInteger("suki.threads.upgradeworld", Integer.getInteger("suki.systemcpus.forupgradeworld", Runtime.getRuntime().availableProcessors()) * 3 / 8); // Suki - multithreading environment variables + final ThreadedWorldUpgrader worldUpgrader = new ThreadedWorldUpgrader(dimensionType, worldSession.getLevelId(), worldSession.levelDirectory.path().toFile(), threads, dataFixer, generatorKey, removeCaches); + worldUpgrader.convert(); + } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a444c8c57a2ab16eba45b0379841a69ff60a5586..d7be9d4e29347b492c22ed2830afc59cffe2d2bc 100644 +index a444c8c57a2ab16eba45b0379841a69ff60a5586..ede16b015b9dde07a7346e0bffde53082145798b 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -294,6 +294,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { + MinecraftServer.LOGGER.error("Uncaught exception in server thread", throwable); + }); +- if (Runtime.getRuntime().availableProcessors() > 4) { +- thread.setPriority(8); ++ // Suki start - multithreading environment variables ++ if (Integer.getInteger("suki.mainthreadpriority", -1) != -1 || Runtime.getRuntime().availableProcessors() > 4) { ++ thread.setPriority(Integer.getInteger("suki.mainthreadpriority", 8)); ++ // Suki end - multithreading environment variables + } + + S s0 = serverFactory.apply(thread); // CraftBukkit - decompile error +@@ -400,6 +403,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 ? Util.makeExecutor(name, -1, levelExecutorThreads) : console.executor, worldSession, worlddata, worldKey, worlddimension, this.getServer().progressListenerFactory.create(11), + worlddata.worldGenSettings().isDebug(), j, creator.environment() == Environment.NORMAL ? list : ImmutableList.of(), true, creator.environment(), generator, biomeProvider); +- ++ // Suki end - multithreading environment variables + if (!(this.worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) { + return null; + } +@@ -2840,6 +2844,13 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); }