Files
MiraiMC/patches/server/0021-Better-handling-of-async-tasks.patch
2022-02-19 13:54:03 +01:00

191 lines
9.2 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Simon Gardling <titaniumtown@gmail.com>
Date: Thu, 8 Jul 2021 17:00:21 -0400
Subject: [PATCH] Better handling of async tasks
Original code by Titaniumtown, licensed under GNU General Public License v3.0
You can find the original code on https://gitlab.com/Titaniumtown/JettPack
diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
index d6a57cdad2c92521a800cb18d060d9d6d627a8c0..0ace819f156ac4a50660d9bcb257d633f2c39b14 100644
--- a/src/main/java/net/minecraft/server/MCUtil.java
+++ b/src/main/java/net/minecraft/server/MCUtil.java
@@ -53,11 +53,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import java.util.concurrent.SynchronousQueue; // Jettpack
+import java.util.concurrent.ConcurrentLinkedQueue; // Jettpack
public final class MCUtil {
+ public static final ConcurrentLinkedQueue smallAsyncTasks = new ConcurrentLinkedQueue(); // Jettpack
public static final ThreadPoolExecutor asyncExecutor = new ThreadPoolExecutor(
- 0, 2, 60L, TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(),
+ 4, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, // Jettpack
+ new SynchronousQueue<Runnable>(), // Jettpack
new ThreadFactoryBuilder()
.setNameFormat("Paper Async Task Handler Thread - %1$d")
.setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(MinecraftServer.LOGGER))
@@ -74,6 +77,30 @@ public final class MCUtil {
public static final long INVALID_CHUNK_KEY = getCoordinateKey(Integer.MAX_VALUE, Integer.MAX_VALUE);
+ // Jettpack start
+ public static void flushAsyncTasks() {
+ if (!smallAsyncTasks.isEmpty()) {
+ asyncExecutor.submit(() -> {
+ Runnable runnable;
+ while((runnable = (Runnable)smallAsyncTasks.poll()) != null) {
+ runnable.run();
+ }
+ });
+ }
+ }
+
+ public static void flushAsyncTasksMidTick() {
+ int i = smallAsyncTasks.size() < 16 ? smallAsyncTasks.size() : 16; // if smallAsyncTasks is over size 16, only execute 16 tasks
+ asyncExecutor.submit(() -> {
+ Runnable runnable;
+ int i_tmp = 0;
+ while((runnable = (Runnable)smallAsyncTasks.poll()) != null && i_tmp != i-1) {
+ runnable.run();
+ i_tmp += 1;
+ }
+ });
+ }
+ // Jettpack end
public static Runnable once(Runnable run) {
AtomicBoolean ran = new AtomicBoolean(false);
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index dfb20123def4e0e3b13d3ae976a0259d1e17bd01..5a9554596a4ec3e1d8435692e9dd25d6bc4fba5e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -372,6 +372,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<Runnab
return;
}
+ MCUtil.flushAsyncTasksMidTick();
co.aikar.timings.MinecraftTimings.midTickChunkTasks.startTiming();
try {
for (;;) {
@@ -1098,6 +1099,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<Runnab
LOGGER.info("Flushing Chunk IO");
com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE.close(true, true); // Paper
LOGGER.info("Closing Thread Pool");
+ MCUtil.flushAsyncTasks();
Util.shutdownExecutors(); // Paper
LOGGER.info("Closing Server");
try {
@@ -1522,6 +1524,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<Runnab
io.papermc.paper.util.CachedLists.reset(); // Paper
// Paper start - move executeAll() into full server tick timing
try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
+ MCUtil.flushAsyncTasks();
this.runAllTasks();
}
// Paper end
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
index f58956e9d8f169adab5ecfc71f9e5f9b181e60ba..a53f2210409410ba2b0edbd479ed8ab21fc8e5a9 100644
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
@@ -127,6 +127,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
}
+ /*
// Paper start - Cache authenticator threads
private static final AtomicInteger threadId = new AtomicInteger(0);
private static final java.util.concurrent.ExecutorService authenticatorPool = java.util.concurrent.Executors.newCachedThreadPool(
@@ -139,6 +140,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
}
);
// Paper end
+ */
// Spigot start
public void initUUID()
{
@@ -277,7 +279,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
// Paper end
// Spigot start
// Paper start - Cache authenticator threads
- authenticatorPool.execute(new Runnable() {
+ net.minecraft.server.MCUtil.asyncExecutor.execute(new Runnable() { // Jettpack
@Override
public void run() {
try {
@@ -321,7 +323,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
}
// Paper start - Cache authenticator threads
- authenticatorPool.execute(new Runnable() {
+ net.minecraft.server.MCUtil.asyncExecutor.execute(new Runnable() { // Jettpack
public void run() {
GameProfile gameprofile = ServerLoginPacketListenerImpl.this.gameProfile;
@@ -455,7 +457,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
this.gameProfile = com.destroystokyo.paper.proxy.VelocityProxy.createProfile(buf);
// Proceed with login
- authenticatorPool.execute(() -> {
+ net.minecraft.server.MCUtil.asyncExecutor.execute(() -> { // Jettpack
try {
new LoginHandler().fireEvents();
} catch (Exception ex) {
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java
index 9c1aff17aabd062640e3f451a2ef8c50a7c62f10..78073cbb7f36950537dc65633e264c30ee8f8a35 100644
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftAsyncScheduler.java
@@ -32,23 +32,29 @@ import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
+/*
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+*/
public class CraftAsyncScheduler extends CraftScheduler {
+ /*
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(
4, Integer.MAX_VALUE,30L, TimeUnit.SECONDS, new SynchronousQueue<>(),
new ThreadFactoryBuilder().setNameFormat("Craft Scheduler Thread - %1$d").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build()); // Paper
+ */
private final Executor management = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder()
.setNameFormat("Craft Async Scheduler Management Thread").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build()); // Paper
private final List<CraftTask> temp = new ArrayList<>();
CraftAsyncScheduler() {
super(true);
+ /*
executor.allowCoreThreadTimeOut(true);
executor.prestartAllCoreThreads();
+ */
}
@Override
@@ -93,7 +99,7 @@ public class CraftAsyncScheduler extends CraftScheduler {
private boolean executeTask(CraftTask task) {
if (isValid(task)) {
this.runners.put(task.getTaskId(), task);
- this.executor.execute(new ServerSchedulerReportingWrapper(task));
+ net.minecraft.server.MCUtil.asyncExecutor.execute(new ServerSchedulerReportingWrapper(task)); // Jettpack
return true;
}
return false;
diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
index bee38307494188800886a1622fed229b88dbd8f1..a45c2c569e0ab7205b8c180c3e150f3d421f648a 100644
--- a/src/main/java/org/spigotmc/WatchdogThread.java
+++ b/src/main/java/org/spigotmc/WatchdogThread.java
@@ -141,6 +141,7 @@ public class WatchdogThread extends Thread
{
while ( !this.stopping )
{
+ net.minecraft.server.MCUtil.flushAsyncTasks(); // Jettpack
//
// Paper start
Logger log = Bukkit.getServer().getLogger();