9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-23 17:09:29 +00:00

Rewrite linear region flush task to fix chunk saving issue if using linear

Co-Authored-By: M2ke4U <79621885+MrHua269@users.noreply.github.com>
This commit is contained in:
Dreeam
2024-04-15 05:43:12 -04:00
parent 9441dac148
commit 4e263b0c3b
14 changed files with 68 additions and 136 deletions

View File

@@ -91,6 +91,7 @@ If these excellent projects hadn't appeared, Leaf wouldn't have become great.
- [SparklyPaper](https://github.com/SparklyPower/SparklyPaper) - [SparklyPaper](https://github.com/SparklyPower/SparklyPaper)
- [Polpot](https://github.com/HaHaWTH/Polpot) - [Polpot](https://github.com/HaHaWTH/Polpot)
- [Matter](https://github.com/plasmoapp/matter) - [Matter](https://github.com/plasmoapp/matter)
- [Luminol](https://github.com/LuminolMC/Luminol)
## 🔥 Special Thanks ## 🔥 Special Thanks
<a href="https://cloud.swordsman.com.cn/"><img src="JiankeServer.jpg" alt="Jianke Cloud Host" align="left" hspace="8"></a> <a href="https://cloud.swordsman.com.cn/"><img src="JiankeServer.jpg" alt="Jianke Cloud Host" align="left" hspace="8"></a>

View File

@@ -3,8 +3,8 @@ From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
Date: Mon, 11 Sep 2023 15:47:19 -0400 Date: Mon, 11 Sep 2023 15:47:19 -0400
Subject: [PATCH] Reduce canSee work Subject: [PATCH] Reduce canSee work
Co-authored by: Martijn Muijsers<martijnmuijsers@live.nl> Co-authored by: Martijn Muijsers <martijnmuijsers@live.nl>
Co-authored by: MachineBreaker<machinebreaker> Co-authored by: MachineBreaker <machinebreaker>
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
index 820f5dc02f89a54fab00942a3eaa72f006b3bd89..14668a88d741de97817cdd7845dc9582610f590d 100644 index 820f5dc02f89a54fab00942a3eaa72f006b3bd89..14668a88d741de97817cdd7845dc9582610f590d 100644

View File

@@ -17,7 +17,7 @@ This format saves about 50% of disk space.
Documentation: https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools Documentation: https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index f90321a70982e2a011f330968483ff1d12164e1b..5c14f2a186509e9f4a7a525320cc7492be939b7c 100644 index 5cd5ed2053bf8538c7733b8cfb784827f879c4c8..90d705a319323c82a9e19cf70c46c80354a7f3f2 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -32,6 +32,8 @@ dependencies { @@ -32,6 +32,8 @@ dependencies {
@@ -118,7 +118,7 @@ index 8dffb330b474b830d2f816ecf8be2e8d2e4556cd..bed46642b59d38e58e6aa663a47cbfc9
long expectedChunks = (long)regionFiles.length * (32L * 32L); long expectedChunks = (long)regionFiles.length * (32L * 32L);
// Gale start - instantly continue on world upgrade finish // Gale start - instantly continue on world upgrade finish
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 2544c8022ed0fdebc407fc85350041d77247d168..78b787edacb65496eb7d84b452dc637deaa094e4 100644 index ad24801339c4b5a4b4035aa85d5c45b3b309e985..8adca25614bb2ff999a2372e80e93402accd761f 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java --- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -866,7 +866,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa @@ -866,7 +866,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -663,7 +663,7 @@ index 0c8bcfbe35f9133a32a31163e5bf2f04786c77a0..63b5a0993207c55357ac507c974dea77
private static void disableGiveCommandDrops() { private static void disableGiveCommandDrops() {
disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops); disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
index f6338904ca0961cfd67326908e9cf72e37c6e86e..21c15670c0c9b988472ac8e875a1c0332060fac3 100644 index f6338904ca0961cfd67326908e9cf72e37c6e86e..1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -27,6 +27,7 @@ import java.util.Map; @@ -27,6 +27,7 @@ import java.util.Map;
@@ -674,7 +674,7 @@ index f6338904ca0961cfd67326908e9cf72e37c6e86e..21c15670c0c9b988472ac8e875a1c033
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class PurpurWorldConfig { public class PurpurWorldConfig {
@@ -118,6 +119,27 @@ public class PurpurWorldConfig { @@ -118,6 +119,30 @@ public class PurpurWorldConfig {
arrowMovementResetsDespawnCounter = getBoolean("gameplay-mechanics.arrow.movement-resets-despawn-counter", arrowMovementResetsDespawnCounter); arrowMovementResetsDespawnCounter = getBoolean("gameplay-mechanics.arrow.movement-resets-despawn-counter", arrowMovementResetsDespawnCounter);
} }
@@ -694,6 +694,9 @@ index f6338904ca0961cfd67326908e9cf72e37c6e86e..21c15670c0c9b988472ac8e875a1c033
+ log(Level.SEVERE, "Linear region compression level should be between 1 and 22 in purpur.yml: " + regionFormatLinearCompressionLevel); + log(Level.SEVERE, "Linear region compression level should be between 1 and 22 in purpur.yml: " + regionFormatLinearCompressionLevel);
+ log(Level.SEVERE, "Falling back to compression level 1."); + log(Level.SEVERE, "Falling back to compression level 1.");
+ regionFormatLinearCompressionLevel = 1; + regionFormatLinearCompressionLevel = 1;
+ } else if (regionFormatLinearCompressionLevel > 1) {
+ // Dreeam TODO - This should become comment after switching to Leaf world config
+ log(Level.SEVERE, "WARNING: DO NOT USE TOO HIGH COMPRESSION LEVEL (Recommended is 1 which is default value if you are using linear). BECAUSE THAT WOULD MAKE YOUR CHUNK DATA IN DANGER!");
+ } + }
+ linearCrashOnBrokenSymlink = getBoolean("region-format.linear.crash-on-broken-symlink", linearCrashOnBrokenSymlink); + linearCrashOnBrokenSymlink = getBoolean("region-format.linear.crash-on-broken-symlink", linearCrashOnBrokenSymlink);
+ } + }
@@ -788,10 +791,10 @@ index 0000000000000000000000000000000000000000..c88ff6fda185a8489cbefa51a7b09ccb
+} +}
diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d313d3e74 index 0000000000000000000000000000000000000000..e381b2e3de96c34c2f5ed4ade7ecedd8a2218c15
--- /dev/null --- /dev/null
+++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java +++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java
@@ -0,0 +1,317 @@ @@ -0,0 +1,325 @@
+package org.purpurmc.purpur.region; +package org.purpurmc.purpur.region;
+ +
+import com.github.luben.zstd.ZstdInputStream; +import com.github.luben.zstd.ZstdInputStream;
@@ -920,7 +923,7 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d
+ } + }
+ +
+ public void flush() throws IOException { + public void flush() throws IOException {
+ if (isMarkedToSave()) flushWrapper(); // sync + if (getAndResetSaveMarker()) flushWrapper(); // sync
+ } + }
+ +
+ private void markToSave() { + private void markToSave() {
@@ -928,10 +931,18 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d
+ markedToSave.set(true); + markedToSave.set(true);
+ } + }
+ +
+ public boolean isMarkedToSave() { + public boolean getAndResetSaveMarker() {
+ return markedToSave.getAndSet(false); + return markedToSave.getAndSet(false);
+ } + }
+ +
+ public boolean isMarkedToSave() {
+ return this.markedToSave.get();
+ }
+
+ public void resetSaveMarker() {
+ this.markedToSave.set(false);
+ }
+
+ public void flushWrapper() { + public void flushWrapper() {
+ try { + try {
+ save(); + save();
@@ -1111,16 +1122,21 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d
+} +}
diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..0d3d9193e8d8f72141dc155840c5eed1a744761c index 0000000000000000000000000000000000000000..249a1f5f8b1f4f5184935aece4efce9e1e18ef18
--- /dev/null --- /dev/null
+++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java +++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java
@@ -0,0 +1,50 @@ @@ -0,0 +1,65 @@
+package org.purpurmc.purpur.region; +package org.purpurmc.purpur.region;
+ +
+import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.common.util.concurrent.ThreadFactoryBuilder;
+ +
+import java.util.Queue; +import java.util.Set;
+import java.util.concurrent.*; +import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+ +
+import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Logger;
@@ -1129,40 +1145,50 @@ index 0000000000000000000000000000000000000000..0d3d9193e8d8f72141dc155840c5eed1
+ +
+public class LinearRegionFileFlusher { +public class LinearRegionFileFlusher {
+ private final Logger LOGGER = LogManager.getLogger(getClass().getName()); + private final Logger LOGGER = LogManager.getLogger(getClass().getName());
+ private final Queue<LinearRegionFile> savingQueue = new LinkedBlockingQueue<>(); + private final Set<LinearRegionFile> pendingSaving = ConcurrentHashMap.newKeySet();
+ private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(
+ new ThreadFactoryBuilder()
+ .setNameFormat("linear-flush-scheduler")
+ .build()
+ );
+ private final ExecutorService executor = Executors.newFixedThreadPool( + private final ExecutorService executor = Executors.newFixedThreadPool(
+ PurpurConfig.linearFlushThreads, + PurpurConfig.linearFlushThreads,
+ new ThreadFactoryBuilder() + new ThreadFactoryBuilder()
+ .setNameFormat("linear-flusher-%d") + .setNameFormat("linear-flusher-%d")
+ .build() + .build()
+ ); + );
+ private final Executor delayedFlusher = CompletableFuture.delayedExecutor(
+ PurpurConfig.linearFlushThreads,
+ TimeUnit.SECONDS,
+ executor
+ );
+ +
+ public LinearRegionFileFlusher() { + public LinearRegionFileFlusher() {
+ Bukkit.getLogger().info("Using " + PurpurConfig.linearFlushThreads + " threads for linear region flushing."); + Bukkit.getLogger().info("Using " + PurpurConfig.linearFlushThreads + " threads for linear region flushing.");
+ scheduler.scheduleAtFixedRate(this::pollAndFlush, 0L, PurpurConfig.linearFlushFrequency, TimeUnit.SECONDS);
+ } + }
+ +
+ public void scheduleSave(LinearRegionFile regionFile) { + public void scheduleSave(LinearRegionFile regionFile) {
+ if (savingQueue.contains(regionFile)) return; + if (this.pendingSaving.contains(regionFile) || !regionFile.isMarkedToSave()) {
+ savingQueue.add(regionFile); + return;
+ }
+
+ private void pollAndFlush() {
+ while (!savingQueue.isEmpty()) {
+ LinearRegionFile regionFile = savingQueue.poll();
+ if (!regionFile.closed && regionFile.isMarkedToSave())
+ executor.execute(regionFile::flushWrapper);
+ } + }
+
+ this.pendingSaving.add(regionFile);
+ this.delayedFlusher.execute(() -> {
+ try {
+ if (!regionFile.closed && regionFile.isMarkedToSave()) {
+ regionFile.flushWrapper();
+ }
+ } finally {
+ regionFile.resetSaveMarker();
+ this.pendingSaving.remove(regionFile);
+ }
+ });
+ } + }
+ +
+ public void shutdown() { + public void shutdown() {
+ executor.shutdown(); + this.executor.shutdown();
+ scheduler.shutdown(); + for (;;) {
+ try {
+ if (this.executor.awaitTermination(5_00, TimeUnit.MILLISECONDS)) break;
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } + }
+} +}
diff --git a/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java b/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java diff --git a/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java b/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java

View File

@@ -209,10 +209,10 @@ index 63b5a0993207c55357ac507c974dea77206e80f4..e45c11bf2c42e6d57f803349d8ca6936
org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27);
enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf21ac5c6d 100644 index 1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe..a4d60637dabcb57e0a559779455603752df03753 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -1190,7 +1190,15 @@ public class PurpurWorldConfig { @@ -1193,7 +1193,15 @@ public class PurpurWorldConfig {
public boolean allayRidableInWater = true; public boolean allayRidableInWater = true;
public boolean allayControllable = true; public boolean allayControllable = true;
public List<String> allayRespectNBT = new ArrayList<>(); public List<String> allayRespectNBT = new ArrayList<>();
@@ -228,7 +228,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf
allayRidable = getBoolean("mobs.allay.ridable", allayRidable); allayRidable = getBoolean("mobs.allay.ridable", allayRidable);
allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater); allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater);
allayControllable = getBoolean("mobs.allay.controllable", allayControllable); allayControllable = getBoolean("mobs.allay.controllable", allayControllable);
@@ -1309,7 +1317,15 @@ public class PurpurWorldConfig { @@ -1312,7 +1320,15 @@ public class PurpurWorldConfig {
public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMin = 0.09D;
public double camelMovementSpeedMax = 0.09D; public double camelMovementSpeedMax = 0.09D;
public int camelBreedingTicks = 6000; public int camelBreedingTicks = 6000;
@@ -244,7 +244,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf
camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater);
camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin);
camelMaxHealthMax = getDouble("mobs.camel.attributes.max_health.max", camelMaxHealthMax); camelMaxHealthMax = getDouble("mobs.camel.attributes.max_health.max", camelMaxHealthMax);
@@ -1739,7 +1755,15 @@ public class PurpurWorldConfig { @@ -1742,7 +1758,15 @@ public class PurpurWorldConfig {
public boolean frogControllable = true; public boolean frogControllable = true;
public float frogRidableJumpHeight = 0.65F; public float frogRidableJumpHeight = 0.65F;
public int frogBreedingTicks = 6000; public int frogBreedingTicks = 6000;
@@ -260,7 +260,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf
frogRidable = getBoolean("mobs.frog.ridable", frogRidable); frogRidable = getBoolean("mobs.frog.ridable", frogRidable);
frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater); frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater);
frogControllable = getBoolean("mobs.frog.controllable", frogControllable); frogControllable = getBoolean("mobs.frog.controllable", frogControllable);
@@ -2685,7 +2709,13 @@ public class PurpurWorldConfig { @@ -2688,7 +2712,13 @@ public class PurpurWorldConfig {
public boolean snifferControllable = true; public boolean snifferControllable = true;
public double snifferMaxHealth = 14.0D; public double snifferMaxHealth = 14.0D;
public int snifferBreedingTicks = 6000; public int snifferBreedingTicks = 6000;
@@ -274,7 +274,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf
snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable);
snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater);
snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable);
@@ -2784,7 +2814,15 @@ public class PurpurWorldConfig { @@ -2787,7 +2817,15 @@ public class PurpurWorldConfig {
public boolean tadpoleRidable = false; public boolean tadpoleRidable = false;
public boolean tadpoleRidableInWater = true; public boolean tadpoleRidableInWater = true;
public boolean tadpoleControllable = true; public boolean tadpoleControllable = true;
@@ -290,7 +290,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf
tadpoleRidable = getBoolean("mobs.tadpole.ridable", tadpoleRidable); tadpoleRidable = getBoolean("mobs.tadpole.ridable", tadpoleRidable);
tadpoleRidableInWater = getBoolean("mobs.tadpole.ridable-in-water", tadpoleRidableInWater); tadpoleRidableInWater = getBoolean("mobs.tadpole.ridable-in-water", tadpoleRidableInWater);
tadpoleControllable = getBoolean("mobs.tadpole.controllable", tadpoleControllable); tadpoleControllable = getBoolean("mobs.tadpole.controllable", tadpoleControllable);
@@ -2996,7 +3034,15 @@ public class PurpurWorldConfig { @@ -2999,7 +3037,15 @@ public class PurpurWorldConfig {
public boolean wardenRidable = false; public boolean wardenRidable = false;
public boolean wardenRidableInWater = true; public boolean wardenRidableInWater = true;
public boolean wardenControllable = true; public boolean wardenControllable = true;

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Use a shadow fork that supports Java 21
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 5c14f2a186509e9f4a7a525320cc7492be939b7c..6eaa616acb8c6f21c6554b0bead67ac7cf613933 100644 index 90d705a319323c82a9e19cf70c46c80354a7f3f2..6a96a847c3b0a7af0e187cc2251c3ad275da4c11 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -3,7 +3,7 @@ import io.papermc.paperweight.util.* @@ -3,7 +3,7 @@ import io.papermc.paperweight.util.*

View File

@@ -1,95 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Radiation_pi <pi1243039811@outlook.com>
Date: Mon, 25 Mar 2024 23:00:19 +0800
Subject: [PATCH] Virtual Thread for linear flusher
diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java
new file mode 100644
index 0000000000000000000000000000000000000000..d4576c9930d12548d4302207f61a0eb8b1fa7b7a
--- /dev/null
+++ b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java
@@ -0,0 +1,29 @@
+package org.dreeam.leaf.config.modules.opt;
+
+import com.electronwill.nightconfig.core.file.CommentedFileConfig;
+import org.dreeam.leaf.config.ConfigInfo;
+import org.dreeam.leaf.config.EnumConfigCategory;
+import org.dreeam.leaf.config.IConfigModule;
+
+public class VT4LinearFlusher implements IConfigModule {
+
+ @Override
+ public EnumConfigCategory getCategory() {
+ return EnumConfigCategory.PERFORMANCE;
+ }
+
+ @Override
+ public String getBaseName() {
+ return "use_virtual_thread_for_linear_flusher";
+ }
+
+ @ConfigInfo(baseName = "enabled")
+ public static boolean enabled = false;
+
+ @Override
+ public void onLoaded(CommentedFileConfig config) {
+ config.setComment("performance.use_virtual_thread_for_linear_flusher", """
+ Use the new Virtual Thread introduced in JDK 21 for Linear Region Flusher.
+ """);
+ }
+}
diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java
index 0d3d9193e8d8f72141dc155840c5eed1a744761c..dc4cf8dc6ab60b6d691e0d74d141f00d7eaf233d 100644
--- a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java
+++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java
@@ -4,9 +4,12 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.Queue;
import java.util.concurrent.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.galemc.gale.virtualthread.VirtualThreadService;
import org.purpurmc.purpur.PurpurConfig;
import org.bukkit.Bukkit;
@@ -18,12 +21,30 @@ public class LinearRegionFileFlusher {
.setNameFormat("linear-flush-scheduler")
.build()
);
- private final ExecutorService executor = Executors.newFixedThreadPool(
- PurpurConfig.linearFlushThreads,
- new ThreadFactoryBuilder()
- .setNameFormat("linear-flusher-%d")
- .build()
- );
+
+ // Leaf start - Use Virtual Thread for linear region flusher
+ private ExecutorService executor;
+
+ {
+ try {
+ if (VirtualThreadService.getJavaMajorVersion() >= VirtualThreadService.minimumJavaMajorVersionWithoutFeaturePreview && org.dreeam.leaf.config.modules.opt.VT4LinearFlusher.enabled) {
+ Method newThreadPerTaskExecutor = Executors.class.getMethod("newThreadPerTaskExecutor", ThreadFactory.class);
+
+ executor = (ExecutorService) newThreadPerTaskExecutor.invoke(null, VirtualThreadService.get().createFactory());
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException |
+ UnsupportedOperationException e) {
+ LOGGER.error("Failed to create Virtual Thread executor! Fallback to default executor.");
+ executor = Executors.newFixedThreadPool(
+ PurpurConfig.linearFlushThreads,
+ new ThreadFactoryBuilder()
+ .setNameFormat("linear-flusher-%d")
+ .build());
+ }
+ }
+ // Leaf end
public LinearRegionFileFlusher() {
Bukkit.getLogger().info("Using " + PurpurConfig.linearFlushThreads + " threads for linear region flushing.");

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Cache player profileResult
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 6eaa616acb8c6f21c6554b0bead67ac7cf613933..370c43af11cd862a31a980549ad822cab2277c05 100644 index 6a96a847c3b0a7af0e187cc2251c3ad275da4c11..517b7551bfaf546109fd8d4d246c083e9e62f85b 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -31,6 +31,10 @@ dependencies { @@ -31,6 +31,10 @@ dependencies {