From 9ea425aee4d0f0bd393cb4ecd7e0183277fe7bd4 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 2 Sep 2025 12:27:01 +0200 Subject: [PATCH] isolate io stuff in its own MultiBurst --- core/src/main/java/com/volmit/iris/Iris.java | 1 + .../java/com/volmit/iris/core/IrisSettings.java | 6 +++--- .../com/volmit/iris/core/loader/IrisData.java | 4 ++-- .../volmit/iris/core/loader/ResourceLoader.java | 2 +- .../iris/core/service/PreservationSVC.java | 4 ---- .../java/com/volmit/iris/util/mantle/Mantle.java | 2 +- .../volmit/iris/util/parallel/MultiBurst.java | 16 +++++++++++----- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index e7613d3e4..d1ae2f560 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -485,6 +485,7 @@ public class Iris extends VolmitPlugin implements Listener { .forEach(PlatformChunkGenerator::close); MultiBurst.burst.close(); + MultiBurst.ioBurst.close(); services.clear(); }); Runtime.getRuntime().addShutdownHook(shutdownHook); diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index 0748926a2..dcab2aa18 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -49,11 +49,10 @@ public class IrisSettings { private IrisSettingsSentry sentry = new IrisSettingsSentry(); public static int getThreadCount(int c) { - return switch (c) { + return Math.max(switch (c) { case -1, -2, -4 -> Runtime.getRuntime().availableProcessors() / -c; - case 0, 1, 2 -> 1; default -> Math.max(c, 2); - }; + }, 1); } public static IrisSettings get() { @@ -138,6 +137,7 @@ public class IrisSettings { @Data public static class IrisSettingsConcurrency { public int parallelism = -1; + public int ioParallelism = -2; public int worldGenParallelism = -1; public int getWorldGenThreads() { diff --git a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java index 00e02ac00..7628f7da7 100644 --- a/core/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/core/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -482,7 +482,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { } public void savePrefetch(Engine engine) { - BurstExecutor b = MultiBurst.burst.burst(loaders.size()); + BurstExecutor b = MultiBurst.ioBurst.burst(loaders.size()); for (ResourceLoader i : loaders.values()) { b.queue(() -> { @@ -499,7 +499,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { } public void loadPrefetch(Engine engine) { - BurstExecutor b = MultiBurst.burst.burst(loaders.size()); + BurstExecutor b = MultiBurst.ioBurst.burst(loaders.size()); for (ResourceLoader i : loaders.values()) { b.queue(() -> { diff --git a/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java b/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java index 15c2f409e..83822ff86 100644 --- a/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java +++ b/core/src/main/java/com/volmit/iris/core/loader/ResourceLoader.java @@ -235,7 +235,7 @@ public class ResourceLoader implements MeteredCache { public KList loadAllParallel(KList s) { KList m = new KList<>(); - BurstExecutor burst = MultiBurst.burst.burst(s.size()); + BurstExecutor burst = MultiBurst.ioBurst.burst(s.size()); for (String i : s) { burst.queue(() -> { diff --git a/core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java b/core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java index b43e3ee95..317e1731e 100644 --- a/core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/PreservationSVC.java @@ -43,10 +43,6 @@ public class PreservationSVC implements IrisService { threads.add(t); } - public void register(MultiBurst burst) { - - } - public void register(ExecutorService service) { services.add(service); } diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 3bdfdfe7e..a5e070b1d 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -88,7 +88,7 @@ public class Mantle { this.ioTectonicUnload = new Semaphore(LOCK_SIZE, true); loadedRegions = new KMap<>(); lastUse = new KMap<>(); - ioBurst = MultiBurst.burst; + ioBurst = MultiBurst.ioBurst; adjustedIdleDuration = new AtomicDouble(0); toUnload = new KSet<>(); worker = new IOWorker(dataFolder, worldHeight); diff --git a/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java b/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java index 500a4a0b2..3762d9ecd 100644 --- a/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java +++ b/core/src/main/java/com/volmit/iris/util/parallel/MultiBurst.java @@ -20,7 +20,6 @@ package com.volmit.iris.util.parallel; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.service.PreservationSVC; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.M; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -30,30 +29,37 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.IntSupplier; public class MultiBurst implements ExecutorService { private static final long TIMEOUT = Long.getLong("iris.burst.timeout", 15000); public static final MultiBurst burst = new MultiBurst(); + public static final MultiBurst ioBurst = new MultiBurst("Iris IO", () -> IrisSettings.get().getConcurrency().getIoParallelism()); private final AtomicLong last; private final String name; private final int priority; + private final IntSupplier parallelism; private ExecutorService service; public MultiBurst() { - this("Iris", Thread.MIN_PRIORITY); + this("Iris", Thread.MIN_PRIORITY, () -> IrisSettings.get().getConcurrency().getParallelism()); } - public MultiBurst(String name, int priority) { + public MultiBurst(String name, IntSupplier parallelism) { + this(name, Thread.MIN_PRIORITY, parallelism); + } + + public MultiBurst(String name, int priority, IntSupplier parallelism) { this.name = name; this.priority = priority; + this.parallelism = parallelism; last = new AtomicLong(M.ms()); - Iris.service(PreservationSVC.class).register(this); } private synchronized ExecutorService getService() { last.set(M.ms()); if (service == null || service.isShutdown()) { - service = new ForkJoinPool(IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()), + service = new ForkJoinPool(IrisSettings.getThreadCount(parallelism.getAsInt()), new ForkJoinPool.ForkJoinWorkerThreadFactory() { int m = 0;