From 0c98279ef1a2bae2168ce0b3a7b8228e552f687b Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 12 Apr 2024 13:49:22 +0000 Subject: [PATCH 1/3] Rewrite linear region flush task dispatching --- ...linear-region-flush-task-dispatching.patch | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch diff --git a/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch b/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch new file mode 100644 index 0000000..f5dfafa --- /dev/null +++ b/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch @@ -0,0 +1,120 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Fri, 12 Apr 2024 13:48:09 +0000 +Subject: [PATCH] Rewrite linear region flush task dispatching + + +diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java +index e40989889f3821bb7484fc0bae5d94b033013904..dc5a5f42c9ca7a50295c18424722568a3ad33fa5 100644 +--- a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java ++++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java +@@ -126,7 +126,7 @@ public class LinearRegionFile implements AbstractRegionFile, AutoCloseable { + } + + public void flush() throws IOException { +- if (isMarkedToSave()) flushWrapper(); // sync ++ if (getAndResetSaveMarker()) flushWrapper(); // sync + } + + private void markToSave() { +@@ -134,10 +134,18 @@ public class LinearRegionFile implements AbstractRegionFile, AutoCloseable { + markedToSave.set(true); + } + +- public boolean isMarkedToSave() { ++ public boolean getAndResetSaveMarker() { + return markedToSave.getAndSet(false); + } + ++ public boolean isMarkedToSave(){ ++ return this.markedToSave.get(); ++ } ++ ++ public void resetSaveMarker(){ ++ this.markedToSave.set(false); ++ } ++ + public void flushWrapper() { + try { + save(); +diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java +index f06d7767c79e465f999b2032086cc224de95152a..65435eb666b2e1cabffc145e016faa5e3b373464 100644 +--- a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java ++++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java +@@ -1,17 +1,14 @@ + package dev.kaiijumc.kaiiju.region; + + import com.google.common.util.concurrent.ThreadFactoryBuilder; +-import java.util.Queue; ++ ++import java.util.Set; + import java.util.concurrent.*; + import org.bukkit.Bukkit; + + public class LinearRegionFileFlusher { +- private final Queue savingQueue = new LinkedBlockingQueue<>(); +- private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( +- new ThreadFactoryBuilder() +- .setNameFormat("linear-flush-scheduler") +- .build() +- ); ++ private final Set pendingSaving = ConcurrentHashMap.newKeySet(); ++ + private final ExecutorService executor = Executors.newFixedThreadPool( + me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads, + new ThreadFactoryBuilder() +@@ -19,26 +16,42 @@ public class LinearRegionFileFlusher { + .build() + ); + ++ private final Executor delayedFlusher = CompletableFuture.delayedExecutor( ++ me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, ++ TimeUnit.SECONDS, ++ executor ++ ); ++ + public LinearRegionFileFlusher() { + Bukkit.getLogger().info("Using " + me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads + " threads for linear region flushing."); +- scheduler.scheduleAtFixedRate(this::pollAndFlush, 0L, me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, TimeUnit.SECONDS); + } + + public void scheduleSave(LinearRegionFile regionFile) { +- if (savingQueue.contains(regionFile)) return; +- savingQueue.add(regionFile); +- } +- +- private void pollAndFlush() { +- while (!savingQueue.isEmpty()) { +- LinearRegionFile regionFile = savingQueue.poll(); +- if (!regionFile.closed && regionFile.isMarkedToSave()) +- executor.execute(regionFile::flushWrapper); ++ if (this.pendingSaving.contains(regionFile) || !regionFile.isMarkedToSave()){ ++ return; + } ++ ++ 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() { +- executor.shutdown(); +- scheduler.shutdown(); ++ this.executor.shutdown(); ++ for (;;) { ++ try { ++ if (this.executor.awaitTermination(5_00,TimeUnit.MILLISECONDS)) break; ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } + } + } From 88b6ffe4088dccef42d7da2e17e5011ba3136ce0 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 12 Apr 2024 13:59:43 +0000 Subject: [PATCH 2/3] Diff changes --- ...-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename patches/server/{0049-Gale-Reduce-lambda-and-Optional-allocation-in.patch => 0049-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch} (96%) diff --git a/patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in.patch b/patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch similarity index 96% rename from patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in.patch rename to patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch index bace207..b70b37f 100644 --- a/patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in.patch +++ b/patches/server/0049-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch @@ -1,7 +1,7 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Sat, 6 Apr 2024 05:14:57 +0000 -Subject: [PATCH] Gale Reduce lambda and Optional allocation in +Subject: [PATCH] Gale Reduce lambda and Optional allocation in EntityBasedExplosionDamageCalculator From b66b10a9754a5a722873f2233721659f2ffe1bd1 Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Fri, 12 Apr 2024 13:59:49 +0000 Subject: [PATCH 3/3] Rebase patches --- ...ju-linear-region-format-and-settings.patch | 71 +++++++---- ...linear-region-flush-task-dispatching.patch | 120 ------------------ 2 files changed, 46 insertions(+), 145 deletions(-) delete mode 100644 patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch diff --git a/patches/server/0019-Kaiiju-linear-region-format-and-settings.patch b/patches/server/0019-Kaiiju-linear-region-format-and-settings.patch index 85b9dc1..4066e1d 100644 --- a/patches/server/0019-Kaiiju-linear-region-format-and-settings.patch +++ b/patches/server/0019-Kaiiju-linear-region-format-and-settings.patch @@ -93,10 +93,10 @@ index 0000000000000000000000000000000000000000..dcfbabf54b19a4c29d5c95830242c5c2 +} diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java new file mode 100644 -index 0000000000000000000000000000000000000000..e40989889f3821bb7484fc0bae5d94b033013904 +index 0000000000000000000000000000000000000000..dc5a5f42c9ca7a50295c18424722568a3ad33fa5 --- /dev/null +++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java -@@ -0,0 +1,316 @@ +@@ -0,0 +1,324 @@ +package dev.kaiijumc.kaiiju.region; + +import com.github.luben.zstd.ZstdInputStream; @@ -225,7 +225,7 @@ index 0000000000000000000000000000000000000000..e40989889f3821bb7484fc0bae5d94b0 + } + + public void flush() throws IOException { -+ if (isMarkedToSave()) flushWrapper(); // sync ++ if (getAndResetSaveMarker()) flushWrapper(); // sync + } + + private void markToSave() { @@ -233,10 +233,18 @@ index 0000000000000000000000000000000000000000..e40989889f3821bb7484fc0bae5d94b0 + markedToSave.set(true); + } + -+ public boolean isMarkedToSave() { ++ public boolean getAndResetSaveMarker() { + return markedToSave.getAndSet(false); + } + ++ public boolean isMarkedToSave(){ ++ return this.markedToSave.get(); ++ } ++ ++ public void resetSaveMarker(){ ++ this.markedToSave.set(false); ++ } ++ + public void flushWrapper() { + try { + save(); @@ -415,24 +423,21 @@ index 0000000000000000000000000000000000000000..e40989889f3821bb7484fc0bae5d94b0 +} diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java new file mode 100644 -index 0000000000000000000000000000000000000000..f06d7767c79e465f999b2032086cc224de95152a +index 0000000000000000000000000000000000000000..65435eb666b2e1cabffc145e016faa5e3b373464 --- /dev/null +++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java -@@ -0,0 +1,44 @@ +@@ -0,0 +1,57 @@ +package dev.kaiijumc.kaiiju.region; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; -+import java.util.Queue; ++ ++import java.util.Set; +import java.util.concurrent.*; +import org.bukkit.Bukkit; + +public class LinearRegionFileFlusher { -+ private final Queue savingQueue = new LinkedBlockingQueue<>(); -+ private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( -+ new ThreadFactoryBuilder() -+ .setNameFormat("linear-flush-scheduler") -+ .build() -+ ); ++ private final Set pendingSaving = ConcurrentHashMap.newKeySet(); ++ + private final ExecutorService executor = Executors.newFixedThreadPool( + me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads, + new ThreadFactoryBuilder() @@ -440,27 +445,43 @@ index 0000000000000000000000000000000000000000..f06d7767c79e465f999b2032086cc224 + .build() + ); + ++ private final Executor delayedFlusher = CompletableFuture.delayedExecutor( ++ me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, ++ TimeUnit.SECONDS, ++ executor ++ ); ++ + public LinearRegionFileFlusher() { + Bukkit.getLogger().info("Using " + me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads + " threads for linear region flushing."); -+ scheduler.scheduleAtFixedRate(this::pollAndFlush, 0L, me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, TimeUnit.SECONDS); + } + + public void scheduleSave(LinearRegionFile regionFile) { -+ if (savingQueue.contains(regionFile)) return; -+ savingQueue.add(regionFile); -+ } -+ -+ private void pollAndFlush() { -+ while (!savingQueue.isEmpty()) { -+ LinearRegionFile regionFile = savingQueue.poll(); -+ if (!regionFile.closed && regionFile.isMarkedToSave()) -+ executor.execute(regionFile::flushWrapper); ++ if (this.pendingSaving.contains(regionFile) || !regionFile.isMarkedToSave()){ ++ return; + } ++ ++ 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() { -+ executor.shutdown(); -+ scheduler.shutdown(); ++ this.executor.shutdown(); ++ for (;;) { ++ try { ++ if (this.executor.awaitTermination(5_00,TimeUnit.MILLISECONDS)) break; ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } + } +} diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/RegionFileFormat.java b/src/main/java/dev/kaiijumc/kaiiju/region/RegionFileFormat.java diff --git a/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch b/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch deleted file mode 100644 index f5dfafa..0000000 --- a/patches/server/0064-Rewrite-linear-region-flush-task-dispatching.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MrHua269 -Date: Fri, 12 Apr 2024 13:48:09 +0000 -Subject: [PATCH] Rewrite linear region flush task dispatching - - -diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java -index e40989889f3821bb7484fc0bae5d94b033013904..dc5a5f42c9ca7a50295c18424722568a3ad33fa5 100644 ---- a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java -+++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFile.java -@@ -126,7 +126,7 @@ public class LinearRegionFile implements AbstractRegionFile, AutoCloseable { - } - - public void flush() throws IOException { -- if (isMarkedToSave()) flushWrapper(); // sync -+ if (getAndResetSaveMarker()) flushWrapper(); // sync - } - - private void markToSave() { -@@ -134,10 +134,18 @@ public class LinearRegionFile implements AbstractRegionFile, AutoCloseable { - markedToSave.set(true); - } - -- public boolean isMarkedToSave() { -+ public boolean getAndResetSaveMarker() { - return markedToSave.getAndSet(false); - } - -+ public boolean isMarkedToSave(){ -+ return this.markedToSave.get(); -+ } -+ -+ public void resetSaveMarker(){ -+ this.markedToSave.set(false); -+ } -+ - public void flushWrapper() { - try { - save(); -diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java -index f06d7767c79e465f999b2032086cc224de95152a..65435eb666b2e1cabffc145e016faa5e3b373464 100644 ---- a/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java -+++ b/src/main/java/dev/kaiijumc/kaiiju/region/LinearRegionFileFlusher.java -@@ -1,17 +1,14 @@ - package dev.kaiijumc.kaiiju.region; - - import com.google.common.util.concurrent.ThreadFactoryBuilder; --import java.util.Queue; -+ -+import java.util.Set; - import java.util.concurrent.*; - import org.bukkit.Bukkit; - - public class LinearRegionFileFlusher { -- private final Queue savingQueue = new LinkedBlockingQueue<>(); -- private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( -- new ThreadFactoryBuilder() -- .setNameFormat("linear-flush-scheduler") -- .build() -- ); -+ private final Set pendingSaving = ConcurrentHashMap.newKeySet(); -+ - private final ExecutorService executor = Executors.newFixedThreadPool( - me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads, - new ThreadFactoryBuilder() -@@ -19,26 +16,42 @@ public class LinearRegionFileFlusher { - .build() - ); - -+ private final Executor delayedFlusher = CompletableFuture.delayedExecutor( -+ me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, -+ TimeUnit.SECONDS, -+ executor -+ ); -+ - public LinearRegionFileFlusher() { - Bukkit.getLogger().info("Using " + me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushThreads + " threads for linear region flushing."); -- scheduler.scheduleAtFixedRate(this::pollAndFlush, 0L, me.earthme.luminol.config.modules.misc.RegionFormatConfig.linearFlushFrequency, TimeUnit.SECONDS); - } - - public void scheduleSave(LinearRegionFile regionFile) { -- if (savingQueue.contains(regionFile)) return; -- savingQueue.add(regionFile); -- } -- -- private void pollAndFlush() { -- while (!savingQueue.isEmpty()) { -- LinearRegionFile regionFile = savingQueue.poll(); -- if (!regionFile.closed && regionFile.isMarkedToSave()) -- executor.execute(regionFile::flushWrapper); -+ if (this.pendingSaving.contains(regionFile) || !regionFile.isMarkedToSave()){ -+ return; - } -+ -+ 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() { -- executor.shutdown(); -- scheduler.shutdown(); -+ this.executor.shutdown(); -+ for (;;) { -+ try { -+ if (this.executor.awaitTermination(5_00,TimeUnit.MILLISECONDS)) break; -+ } catch (InterruptedException e) { -+ e.printStackTrace(); -+ } -+ } - } - }