9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-19 15:09:18 +00:00

isolate io stuff in its own MultiBurst

This commit is contained in:
Julian Krings
2025-09-02 12:27:01 +02:00
parent 709f05c1a5
commit 9ea425aee4
7 changed files with 19 additions and 16 deletions

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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(() -> {

View File

@@ -235,7 +235,7 @@ public class ResourceLoader<T extends IrisRegistrant> implements MeteredCache {
public KList<T> loadAllParallel(KList<String> s) {
KList<T> m = new KList<>();
BurstExecutor burst = MultiBurst.burst.burst(s.size());
BurstExecutor burst = MultiBurst.ioBurst.burst(s.size());
for (String i : s) {
burst.queue(() -> {

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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;