From 74e87a7faeade559131ba0f9db896c2c1755f11d Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 17 Nov 2023 12:17:46 +0100 Subject: [PATCH 01/66] Fix for HotDropWorldSVC.java not working --- .../iris/core/service/HotDropWorldSVC.java | 74 +++++++++++-------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index 88bab482b..c16ea949a 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -5,6 +5,10 @@ import static java.nio.file.StandardWatchEventKinds.*; import java.io.File; import java.io.FileReader; import java.io.IOException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonParseException; @@ -16,20 +20,21 @@ import com.volmit.iris.util.scheduling.Looper; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; -public class HotDropWorldSVC extends Looper implements IrisService { +public class HotDropWorldSVC implements IrisService { private WatchService watchService; private JavaPlugin plugin; + public Looper ticker; @Override public void onEnable() { - this.plugin = Iris.instance; // Assuming Iris.instance is your plugin instance + Iris.info("hotDropSVC"); + this.plugin = Iris.instance; initializeWatchService(); - } @Override public void onDisable() { - + ticker.interrupt(); } private void initializeWatchService() { @@ -37,47 +42,54 @@ public class HotDropWorldSVC extends Looper implements IrisService { this.watchService = FileSystems.getDefault().newWatchService(); Path path = Paths.get(Bukkit.getWorldContainer().getAbsolutePath()); path.register(watchService, ENTRY_CREATE); + this.startLoop(); + ticker.start(); } catch (Exception e) { Iris.reportError(e); e.printStackTrace(); } } - @Override - protected long loop() { - WatchKey key; - try { - key = watchService.poll(); - if (key != null) { - for (WatchEvent event : key.pollEvents()) { - WatchEvent.Kind kind = event.kind(); + public void startLoop() { + final JavaPlugin finalPlugin = this.plugin; + ticker = new Looper() { + @Override + protected long loop() { + WatchKey key; + try { + key = watchService.poll(); + if (key != null) { + for (WatchEvent event : key.pollEvents()) { + WatchEvent.Kind kind = event.kind(); - if (kind == ENTRY_CREATE) { - WatchEvent ev = (WatchEvent) event; - Path filename = ev.context(); + if (kind == ENTRY_CREATE) { + WatchEvent ev = (WatchEvent) event; + Path filename = ev.context(); - File newDir = new File(Bukkit.getWorldContainer(), filename.toString()); - File irisFolder = new File(newDir, "iris"); - if (irisFolder.exists() && irisFolder.isDirectory()) { - Iris.info("World HotDrop Detected!"); - String worldName = newDir.getName(); - String version = getVersionFromIrisFolder(irisFolder); + File newDir = new File(Bukkit.getWorldContainer(), filename.toString()); + File irisFolder = new File(newDir, "iris"); + if (irisFolder.exists() && irisFolder.isDirectory()) { + Iris.info("World HotDrop Detected!"); + String worldName = newDir.getName(); + String version = getVersionFromIrisFolder(irisFolder); - if (Bukkit.getWorld(worldName) == null && isPackValid(worldName, version)) { - Bukkit.getScheduler().runTask(this.plugin, () -> WorldHandlerSFG.LoadWorld(worldName)); + if (Bukkit.getWorld(worldName) == null && isPackValid(worldName, version)) { + Bukkit.getScheduler().runTask(finalPlugin, () -> WorldHandlerSFG.LoadWorld(worldName)); + } + } } } + key.reset(); } + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; } - key.reset(); - } - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - return -1; - } - return 1000; + return 1000; + } + }; } private String getVersionFromIrisFolder(File irisFolder) { From c5220c8d06fd03c951749472726387c008b623dc Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 17 Nov 2023 12:20:47 +0100 Subject: [PATCH 02/66] Fix for HotDropWorldSVC.java not working --- .../main/java/com/volmit/iris/core/service/HotDropWorldSVC.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index c16ea949a..6f633bd7f 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -27,7 +27,6 @@ public class HotDropWorldSVC implements IrisService { @Override public void onEnable() { - Iris.info("hotDropSVC"); this.plugin = Iris.instance; initializeWatchService(); } From cc95e1ae63f86153c0d6f9e3223c30e9cb79cd03 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 23 Nov 2023 16:47:55 +0100 Subject: [PATCH 03/66] More more --- .../iris/core/commands/CommandDeveloper.java | 3 +- .../core/service/DynamicPerformanceSVC.java | 84 +++++++++++++++++++ .../iris/engine/mantle/EngineMantle.java | 2 +- .../com/volmit/iris/util/mantle/Mantle.java | 83 +++++++++++------- 4 files changed, 138 insertions(+), 34 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 807f700a7..570e38f60 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -51,13 +51,12 @@ public class CommandDeveloper implements DecreeExecutor { Engine engine = IrisToolbelt.access(world).getEngine(); if(engine != null) { long lastUseSize = engine.getMantle().getLastUseMapMemoryUsage(); - long outputToUnload = engine.getMantle().getToUnload(); Iris.info("-------------------------"); Iris.info(C.DARK_PURPLE + "Engine Status"); Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); - Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + outputToUnload); + Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload()); Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize)); diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java new file mode 100644 index 000000000..045fd39c5 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -0,0 +1,84 @@ +package com.volmit.iris.core.service; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.SFG.WorldHandlerSFG; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.misc.getHardware; +import com.volmit.iris.util.plugin.IrisService; +import com.volmit.iris.util.scheduling.Looper; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.*; +import java.util.Comparator; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import static com.volmit.iris.util.mantle.Mantle.*; +import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; + +public class DynamicPerformanceSVC implements IrisService { + private JavaPlugin plugin; + public Looper ticker; + public Mantle mantle; + public Engine engine; + + @Override + public void onEnable() { + this.plugin = Iris.instance; + if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { + Iris.info("Enabled DynamicPerformance"); + this.startupPerformance(); + this.DynamicPerformance(); + ticker.start(); + } + } + + public void DynamicPerformance(){ + ticker = new Looper() { + @Override + protected long loop() { + try { + + + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; + } + + return 1000; + } + }; + } + public void startupPerformance(){ + if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { + tectonicLimit.set(2); + long t = getHardware.getProcessMemory(); + for (; t > 250; ) { + tectonicLimit.getAndAdd(1); + t = t - 250; + } + //tectonicLimit.set(10); + } + } + + @Override + public void onDisable() { + ticker.interrupt(); + + } +} + diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index bef1cddcf..d7d9ecbd9 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -293,7 +293,7 @@ public interface EngineMantle extends IObjectPlacer { } default long getToUnload(){ - return getMantle().FakeToUnload.get(); + return Mantle.FakeToUnload.get(); } default double getTectonicLimit(){ return getMantle().tectonicLimit.get(); 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 34d2263d7..7cfdf8274 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 @@ -37,25 +37,22 @@ import com.volmit.iris.util.function.Consumer4; import com.volmit.iris.util.math.M; import com.volmit.iris.util.matter.Matter; import com.volmit.iris.util.matter.MatterSlice; -import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; -import com.volmit.iris.util.scheduling.Looper; import lombok.Getter; import org.bukkit.Chunk; -import org.checkerframework.checker.units.qual.A; import java.io.EOFException; import java.io.File; import java.io.IOException; +import java.util.Comparator; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; /** * The mantle can store any type of data slice anywhere and manage regions & IO on it's own. @@ -67,16 +64,12 @@ public class Mantle { private final int worldHeight; private final Map lastUse; @Getter - private final Map loadedRegions; + public static Map loadedRegions; private final HyperLock hyperLock; private final KSet unload; private final AtomicBoolean closed; private final MultiBurst ioBurst; private final AtomicBoolean io; - private final Object gcMonitor = new Object(); - long apm = getHardware.getAvailableProcessMemory(); - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - int tectonicLimitBeforeOutMemory; /** * Create a new mantle @@ -404,53 +397,82 @@ public class Mantle { * @param baseIdleDuration the duration */ - public AtomicInteger FakeToUnload = new AtomicInteger(0); - public AtomicDouble adjustedIdleDuration = new AtomicDouble(0); - public AtomicInteger tectonicLimit = new AtomicInteger(30); + public static AtomicInteger FakeToUnload = new AtomicInteger(0); + public static AtomicDouble adjustedIdleDuration = new AtomicDouble(0); + public static AtomicInteger tectonicLimit = new AtomicInteger(30); public synchronized void trim(long baseIdleDuration) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } - - if (IrisSettings.get().getPerformance().dynamicPerformanceMode){ - tectonicLimit.set(2); - long t = getHardware.getProcessMemory(); - for (; t > 250;){ - tectonicLimit.getAndAdd(1); - t = t - 250; - } - } - adjustedIdleDuration.set(baseIdleDuration); - if (loadedRegions.size() > tectonicLimit.get()) { - // todo update this correctly and maybe do something when its above a 100% - if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { - int tectonicLimitValue = tectonicLimit.get(); - adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); + if (loadedRegions != null) { + if (loadedRegions.size() > tectonicLimit.get()) { + // todo update this correctly and maybe do something when its above a 100% + if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { + int tectonicLimitValue = tectonicLimit.get(); + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); + } } } io.set(true); try { + Set toUnload; Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); - Set toUnload = new HashSet<>(); + toUnload = new HashSet<>(); for (Long i : lastUse.keySet()) { double finalAdjustedIdleDuration = adjustedIdleDuration.get(); + Set finalToUnload1 = toUnload; hyperLock.withLong(i, () -> { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { - toUnload.add(i); + finalToUnload1.add(i); FakeToUnload.addAndGet(1); Iris.debug("Tectonic Region added to unload"); } }); } - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), toUnload.size()); + /* + if (loadedRegions.size() > tectonicLimit.get()) { + AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); + + for (; dummyLoadedRegions.get() > tectonicLimit.get();) { + try { + long fiveSecondsAgo = M.ms() - 5000; + toUnload = new HashSet<>(); + + Long oldestOverFiveSeconds = lastUse.entrySet().stream() + .filter(e -> e.getValue() < fiveSecondsAgo) + .max(Comparator.comparingLong(Map.Entry::getValue)) + .map(Map.Entry::getKey) + .orElse(null); + + if (oldestOverFiveSeconds != null) { + Set finalToUnload = toUnload; + hyperLock.withLong(oldestOverFiveSeconds, () -> { + if (M.ms() - lastUse.get(oldestOverFiveSeconds) >= adjustedIdleDuration.get()) { + finalToUnload.add(oldestOverFiveSeconds); + FakeToUnload.addAndGet(1); + Iris.debug("Oldest Tectonic Region over 5 seconds idle added to unload"); + dummyLoadedRegions.getAndDecrement(); + } + }); + } + } catch (Exception e) { + + } + } + } + */ + + int numThreads = 1; // Specify the number of threads you want + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(numThreads), toUnload.size()); + for (Long i : toUnload) { burstExecutor.queue(() -> { @@ -470,7 +492,6 @@ public class Mantle { }); }); } - burstExecutor.complete(); } finally { From 8bb1964b3091b4d27787deeabfc5719fcdaca7cc Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 23 Nov 2023 16:49:45 +0100 Subject: [PATCH 04/66] smth like this --- core/src/main/java/com/volmit/iris/core/IrisSettings.java | 1 + core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) 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 d37dfb1b5..252ed1fea 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -141,6 +141,7 @@ public class IrisSettings { public int resourceLoaderCacheSize = 1_024; public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; + public int tectonicUnloadThreads = 1; public boolean dynamicPerformanceMode = true; } 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 7cfdf8274..6fb904260 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 @@ -470,8 +470,7 @@ public class Mantle { } */ - int numThreads = 1; // Specify the number of threads you want - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(numThreads), toUnload.size()); + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(IrisSettings.get().getPerformance().tectonicUnloadThreads), toUnload.size()); for (Long i : toUnload) { From 0adfe6911f28f886e12b44e292c73203fc2eb81c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 13:08:42 +0100 Subject: [PATCH 05/66] smth like this --- .../com/volmit/iris/core/IrisSettings.java | 4 +- .../iris/core/commands/CommandDeveloper.java | 1 + .../core/service/DynamicPerformanceSVC.java | 4 +- .../iris/engine/mantle/EngineMantle.java | 5 +- .../com/volmit/iris/util/mantle/Mantle.java | 59 +++++++++++++++---- 5 files changed, 56 insertions(+), 17 deletions(-) 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 252ed1fea..f3ac56d5f 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -141,8 +141,10 @@ public class IrisSettings { public int resourceLoaderCacheSize = 1_024; public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; - public int tectonicUnloadThreads = 1; + public int tectonicUnloadThreads = -1; // -1 = Disabled and instead use the dynamic method public boolean dynamicPerformanceMode = true; + public boolean AggressiveTectonicUnload = false; + public int AggressiveTectonicThreshold = -1; // -1 = Disabled and instead uses the tectonicLimit } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 570e38f60..842c89a9a 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -54,6 +54,7 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info("-------------------------"); Iris.info(C.DARK_PURPLE + "Engine Status"); + Iris.info(C.DARK_PURPLE + "Tectonic Threads: " + C.LIGHT_PURPLE + engine.getMantle().getDynamicThreads()); Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload()); diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index 045fd39c5..4d28dc414 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -39,7 +39,6 @@ public class DynamicPerformanceSVC implements IrisService { public void onEnable() { this.plugin = Iris.instance; if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { - Iris.info("Enabled DynamicPerformance"); this.startupPerformance(); this.DynamicPerformance(); ticker.start(); @@ -52,7 +51,6 @@ public class DynamicPerformanceSVC implements IrisService { protected long loop() { try { - } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -71,7 +69,7 @@ public class DynamicPerformanceSVC implements IrisService { tectonicLimit.getAndAdd(1); t = t - 250; } - //tectonicLimit.set(10); + tectonicLimit.set(10); } } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index d7d9ecbd9..a29752437 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -293,7 +293,10 @@ public interface EngineMantle extends IObjectPlacer { } default long getToUnload(){ - return Mantle.FakeToUnload.get(); + return Mantle.fakeToUnload.get(); + } + default long getDynamicThreads(){ + return Mantle.dynamicThreads.get(); } default double getTectonicLimit(){ return getMantle().tectonicLimit.get(); 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 6fb904260..09b226236 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 @@ -397,15 +397,53 @@ public class Mantle { * @param baseIdleDuration the duration */ - public static AtomicInteger FakeToUnload = new AtomicInteger(0); + @Getter + public static AtomicInteger fakeToUnload = new AtomicInteger(0); + public static AtomicInteger oldFakeToUnload = new AtomicInteger((0)); public static AtomicDouble adjustedIdleDuration = new AtomicDouble(0); public static AtomicInteger tectonicLimit = new AtomicInteger(30); + public static AtomicInteger dynamicThreads = new AtomicInteger(1); + public static AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); + public int g = 0; public synchronized void trim(long baseIdleDuration) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } + if (forceAggressiveThreshold.get() <= -1) { + forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); + } else { + forceAggressiveThreshold.set(tectonicLimit.get()); + } + + if(IrisSettings.get().getPerformance().dynamicPerformanceMode) { + int h = dynamicThreads.get() - 1; + if (fakeToUnload.get() != 0) { + if (fakeToUnload.get() > oldFakeToUnload.get()) { + g++; + if (g >= 2 && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) > h && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) != h) { + dynamicThreads.addAndGet(1); + } + } else { + g--; + } + } else { + if (dynamicThreads.get() >= 2) { + dynamicThreads.addAndGet(-1); + } + } + oldFakeToUnload = fakeToUnload; + } + if (!IrisSettings.get().getPerformance().dynamicPerformanceMode){ + if(IrisSettings.get().getPerformance().getTectonicUnloadThreads() <= -1){ + dynamicThreads.set(1); + } else { + dynamicThreads.set(IrisSettings.get().getPerformance().getTectonicUnloadThreads()); + } + } + int dth = dynamicThreads.get(); + adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions != null) { @@ -431,14 +469,13 @@ public class Mantle { hyperLock.withLong(i, () -> { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { finalToUnload1.add(i); - FakeToUnload.addAndGet(1); + fakeToUnload.addAndGet(1); Iris.debug("Tectonic Region added to unload"); } }); } - /* - if (loadedRegions.size() > tectonicLimit.get()) { + if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > tectonicLimit.get() && tectonicLimit.get() > forceAggressiveThreshold.get()) { AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); for (; dummyLoadedRegions.get() > tectonicLimit.get();) { @@ -457,7 +494,7 @@ public class Mantle { hyperLock.withLong(oldestOverFiveSeconds, () -> { if (M.ms() - lastUse.get(oldestOverFiveSeconds) >= adjustedIdleDuration.get()) { finalToUnload.add(oldestOverFiveSeconds); - FakeToUnload.addAndGet(1); + fakeToUnload.getAndAdd(1); Iris.debug("Oldest Tectonic Region over 5 seconds idle added to unload"); dummyLoadedRegions.getAndDecrement(); } @@ -468,13 +505,11 @@ public class Mantle { } } } - */ - - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(IrisSettings.get().getPerformance().tectonicUnloadThreads), toUnload.size()); + // BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(1), toUnload.size()); for (Long i : toUnload) { - burstExecutor.queue(() -> { + // burstExecutor.queue(() -> { hyperLock.withLong(i, () -> { TectonicPlate m = loadedRegions.get(i); if (m != null) { @@ -482,16 +517,16 @@ public class Mantle { m.write(fileForRegion(dataFolder, i)); loadedRegions.remove(i); lastUse.remove(i); + fakeToUnload.getAndAdd(-1); Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - FakeToUnload.addAndGet(-1); } catch (IOException e) { e.printStackTrace(); } } }); - }); + // }); } - burstExecutor.complete(); + // burstExecutor.complete(); } finally { io.set(false); From 32afcc347812baeef721b9f0a065d3d7e0875622 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 15:20:24 +0100 Subject: [PATCH 06/66] - Fixed hotdrop being activated on world creation - Improved /iris delete - Unfinished code --- .../iris/core/commands/CommandDeveloper.java | 7 +++++ .../iris/core/commands/CommandIris.java | 14 +++++++--- .../iris/core/service/HotDropWorldSVC.java | 5 ++++ .../iris/core/tools/IrisWorldCreator.java | 4 +-- .../iris/engine/object/IrisEngineData.java | 1 + .../engine/object/IrisEngineWorldData.java | 27 +++++++++++++++++++ 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 842c89a9a..675f85f14 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -23,6 +23,7 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.EngineMantle; +import com.volmit.iris.engine.object.IrisEngineWorldData; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; @@ -66,6 +67,12 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info(C.RED + "Engine is null!"); } } + @Decree(description = "Test", origin = DecreeOrigin.BOTH) + public void test(){ + Iris.info("Test Developer CMD Executed"); + IrisEngineWorldData worldData = new IrisEngineWorldData(); + worldData.injection(); + } } diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index b80548c29..af193fc8a 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -25,6 +25,7 @@ import com.volmit.iris.core.tools.IrisBenchmarking; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.engine.object.IrisEngineWorldData; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.util.collection.KList; @@ -72,6 +73,7 @@ public class CommandIris implements DecreeExecutor { private CommandDeveloper developer; public static @Getter String BenchDimension; + public static boolean worldCreation = false; @Decree(description = "Create a new world", aliases = {"+", "c"}) public void create( @@ -117,6 +119,7 @@ public class CommandIris implements DecreeExecutor { } try { + worldCreation = true; IrisToolbelt.createWorld() .dimension(type.getLoadKey()) .name(name) @@ -128,9 +131,10 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.RED + "Exception raised during creation. See the console for more details."); Iris.error("Exception raised during world creation: " + e.getMessage()); Iris.reportError(e); + worldCreation = false; return; } - + worldCreation = false; sender().sendMessage(C.GREEN + "Successfully created your world!"); } @@ -163,6 +167,8 @@ public class CommandIris implements DecreeExecutor { public void version() { sender().sendMessage(C.GREEN + "Iris v" + Iris.instance.getDescription().getVersion() + " by Volmit Software"); } + + //todo Move to React @Decree(description = "Benchmark your server", origin = DecreeOrigin.CONSOLE) public void serverbenchmark() throws InterruptedException { if(!inProgress) { @@ -171,6 +177,7 @@ public class CommandIris implements DecreeExecutor { Iris.info(C.RED + "Benchmark already is in progress."); } } + /* /todo Fix PREGEN @Decree(description = "Benchmark a pack", origin = DecreeOrigin.CONSOLE) @@ -239,7 +246,7 @@ public class CommandIris implements DecreeExecutor { IrisToolbelt.evacuate(world, "Deleting world"); deletingWorld = true; Bukkit.unloadWorld(world, false); - int retries = 10; + int retries = 12; if (delete) { if (deleteDirectory(world.getWorldFolder())) { sender().sendMessage(C.GREEN + "Successfully removed world folder"); @@ -249,13 +256,12 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.GREEN + "Successfully removed world folder"); break; } - sender().sendMessage(C.GREEN + "DEBUG1"); retries--; if (retries == 0){ sender().sendMessage(C.RED + "Failed to remove world folder"); break; } - J.sleep(2000); + J.sleep(3000); } } } diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index 6f633bd7f..7018da500 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -1,6 +1,8 @@ package com.volmit.iris.core.service; import java.nio.file.*; + +import static com.volmit.iris.core.commands.CommandIris.worldCreation; import static java.nio.file.StandardWatchEventKinds.*; import java.io.File; import java.io.FileReader; @@ -56,6 +58,9 @@ public class HotDropWorldSVC implements IrisService { protected long loop() { WatchKey key; try { + if (worldCreation){ + return -1; + } key = watchService.poll(); if (key != null) { for (WatchEvent event : key.pollEvents()) { diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java index 14d9a732f..cd6c17a91 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java @@ -19,8 +19,7 @@ package com.volmit.iris.core.tools; import com.volmit.iris.core.loader.IrisData; -import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.engine.object.IrisWorld; +import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.platform.BukkitChunkGenerator; import org.bukkit.Bukkit; import org.bukkit.World; @@ -79,6 +78,7 @@ public class IrisWorldCreator { ? dim.getLoader().getDataFolder() : new File(w.worldFolder(), "iris/pack"), dimensionName); + return new WorldCreator(name) .environment(findEnvironment()) .generateStructures(true) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java index 418340124..99ae9e1ae 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java @@ -26,6 +26,7 @@ import lombok.Data; @Data public class IrisEngineData { private IrisEngineStatistics statistics = new IrisEngineStatistics(); + private KList IrisEngineWorldData = new KList<>(); private KList spawnerCooldowns = new KList<>(); private KList chunks = new KList<>(); private Long seed = null; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java new file mode 100644 index 000000000..b4036d423 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java @@ -0,0 +1,27 @@ +package com.volmit.iris.engine.object; + +import com.volmit.iris.Iris; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.util.collection.KList; +import lombok.Data; + +@Data +public class IrisEngineWorldData { + private int cooltest = 0; + private String version = "null"; + + public IrisEngineWorldData() { + this.cooltest = 0; + this.version = "null"; + } + + public void injection() { + Iris.info("TEST"); + version = "test"; + } + + public boolean isEmpty() { + return version.isEmpty(); + } +} + From 5fc012a5574b3521aff2abf3fcc749ba0fe484ff Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 15:27:05 +0100 Subject: [PATCH 07/66] no way im spending more time on something stupid as this --- .../iris/core/commands/CommandDeveloper.java | 3 --- .../iris/core/commands/CommandIris.java | 1 - .../iris/engine/object/IrisEngineData.java | 1 - .../engine/object/IrisEngineWorldData.java | 27 ------------------- 4 files changed, 32 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 675f85f14..57e1809a0 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -23,7 +23,6 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.EngineMantle; -import com.volmit.iris.engine.object.IrisEngineWorldData; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; @@ -70,8 +69,6 @@ public class CommandDeveloper implements DecreeExecutor { @Decree(description = "Test", origin = DecreeOrigin.BOTH) public void test(){ Iris.info("Test Developer CMD Executed"); - IrisEngineWorldData worldData = new IrisEngineWorldData(); - worldData.injection(); } } diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index af193fc8a..b36b6e294 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -25,7 +25,6 @@ import com.volmit.iris.core.tools.IrisBenchmarking; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.engine.object.IrisEngineWorldData; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.util.collection.KList; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java index 99ae9e1ae..418340124 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineData.java @@ -26,7 +26,6 @@ import lombok.Data; @Data public class IrisEngineData { private IrisEngineStatistics statistics = new IrisEngineStatistics(); - private KList IrisEngineWorldData = new KList<>(); private KList spawnerCooldowns = new KList<>(); private KList chunks = new KList<>(); private Long seed = null; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java deleted file mode 100644 index b4036d423..000000000 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineWorldData.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.volmit.iris.engine.object; - -import com.volmit.iris.Iris; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.util.collection.KList; -import lombok.Data; - -@Data -public class IrisEngineWorldData { - private int cooltest = 0; - private String version = "null"; - - public IrisEngineWorldData() { - this.cooltest = 0; - this.version = "null"; - } - - public void injection() { - Iris.info("TEST"); - version = "test"; - } - - public boolean isEmpty() { - return version.isEmpty(); - } -} - From de0e124ebbc9439626428ecea4cb5be2db1ab052 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 15:38:12 +0100 Subject: [PATCH 08/66] For fuck's sake, why haven't I done this earlier --- .../iris/engine/object/IrisEngineStatistics.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java index f6a723cd5..4d233cc04 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java @@ -18,17 +18,31 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.Iris; import lombok.Data; @Data public class IrisEngineStatistics { private int totalHotloads = 0; private int chunksGenerated = 0; + private String IrisCreationVersion = getVersion(); public void generatedChunk() { chunksGenerated++; } + public String getVersion() { + String input = Iris.instance.getDescription().getVersion(); + int hyphenIndex = input.indexOf('-'); + + String result = null; + if (hyphenIndex != -1) { + result = input.substring(0, hyphenIndex); + System.out.println(result); + } + return result; + } + public void hotloaded() { totalHotloads++; } From 6edd8bf1192d47ce956394790ad65a663861b6de Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 15:55:17 +0100 Subject: [PATCH 09/66] Ah --- .../engine/object/IrisEngineStatistics.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java index 4d233cc04..f41a9b5c4 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java @@ -20,12 +20,17 @@ package com.volmit.iris.engine.object; import com.volmit.iris.Iris; import lombok.Data; +import org.bukkit.Bukkit; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Data public class IrisEngineStatistics { private int totalHotloads = 0; private int chunksGenerated = 0; private String IrisCreationVersion = getVersion(); + private String MinecraftVersion = getMCVersion(); public void generatedChunk() { chunksGenerated++; @@ -38,10 +43,22 @@ public class IrisEngineStatistics { String result = null; if (hyphenIndex != -1) { result = input.substring(0, hyphenIndex); - System.out.println(result); } return result; } + public String getMCVersion() { + String bukkitVersion = "git-Purpur-2023 (MC: 1.20.1)"; + + Pattern pattern = Pattern.compile("\\(MC: (\\d+\\.\\d+(\\.\\d+)?)\\)"); + Matcher matcher = pattern.matcher(bukkitVersion); + + if (matcher.find()) { + return matcher.group(1); + } else { + return "ERROR"; // todo: Maybe do something ? + } + } + public void hotloaded() { totalHotloads++; From 47990cde46c362ec2a66f3aea1e1e72b69372f00 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 24 Nov 2023 20:44:56 +0100 Subject: [PATCH 10/66] Thanks @CrazyDev! --- .../iris/engine/mantle/EngineMantle.java | 10 +- .../com/volmit/iris/util/mantle/Mantle.java | 95 +++++++++---------- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index a29752437..5b46c4b8a 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -293,15 +293,15 @@ public interface EngineMantle extends IObjectPlacer { } default long getToUnload(){ - return Mantle.fakeToUnload.get(); + return getMantle().getFakeToUnload().get(); } default long getDynamicThreads(){ - return Mantle.dynamicThreads.get(); + return getMantle().getDynamicThreads().get(); } default double getTectonicLimit(){ - return getMantle().tectonicLimit.get(); + return Mantle.tectonicLimit.get(); } default double getTectonicDuration(){ - return getMantle().adjustedIdleDuration.get(); + return getMantle().getAdjustedIdleDuration().get(); } -} +} \ No newline at end of file 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 09b226236..72af5f2fc 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 @@ -64,7 +64,7 @@ public class Mantle { private final int worldHeight; private final Map lastUse; @Getter - public static Map loadedRegions; + private final Map loadedRegions; private final HyperLock hyperLock; private final KSet unload; private final AtomicBoolean closed; @@ -390,23 +390,24 @@ public class Mantle { return numberOfEntries * bytesPerEntry; } + @Getter + private final AtomicInteger fakeToUnload = new AtomicInteger(0); + private final AtomicInteger oldFakeToUnload = new AtomicInteger((0)); + @Getter + private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); + public static final AtomicInteger tectonicLimit = new AtomicInteger(30); + @Getter + private final AtomicInteger dynamicThreads = new AtomicInteger(1); + @Getter + private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); + private int g = 0; + /** * Save & unload regions that have not been used for more than the * specified amount of milliseconds * * @param baseIdleDuration the duration */ - - @Getter - public static AtomicInteger fakeToUnload = new AtomicInteger(0); - public static AtomicInteger oldFakeToUnload = new AtomicInteger((0)); - public static AtomicDouble adjustedIdleDuration = new AtomicDouble(0); - public static AtomicInteger tectonicLimit = new AtomicInteger(30); - public static AtomicInteger dynamicThreads = new AtomicInteger(1); - public static AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); - public int g = 0; - - public synchronized void trim(long baseIdleDuration) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); @@ -433,7 +434,7 @@ public class Mantle { dynamicThreads.addAndGet(-1); } } - oldFakeToUnload = fakeToUnload; + oldFakeToUnload.set(fakeToUnload.get()); } if (!IrisSettings.get().getPerformance().dynamicPerformanceMode){ if(IrisSettings.get().getPerformance().getTectonicUnloadThreads() <= -1){ @@ -459,16 +460,14 @@ public class Mantle { io.set(true); try { - Set toUnload; + final Set toUnload = new HashSet<>(); Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); - toUnload = new HashSet<>(); for (Long i : lastUse.keySet()) { double finalAdjustedIdleDuration = adjustedIdleDuration.get(); - Set finalToUnload1 = toUnload; hyperLock.withLong(i, () -> { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { - finalToUnload1.add(i); + toUnload.add(i); fakeToUnload.addAndGet(1); Iris.debug("Tectonic Region added to unload"); } @@ -478,55 +477,51 @@ public class Mantle { if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > tectonicLimit.get() && tectonicLimit.get() > forceAggressiveThreshold.get()) { AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); - for (; dummyLoadedRegions.get() > tectonicLimit.get();) { + while (dummyLoadedRegions.get() > tectonicLimit.get()) { try { long fiveSecondsAgo = M.ms() - 5000; - toUnload = new HashSet<>(); + toUnload.clear(); - Long oldestOverFiveSeconds = lastUse.entrySet().stream() + lastUse.entrySet().stream() .filter(e -> e.getValue() < fiveSecondsAgo) .max(Comparator.comparingLong(Map.Entry::getValue)) .map(Map.Entry::getKey) - .orElse(null); + .ifPresent(oldestOverFiveSeconds -> hyperLock.withLong(oldestOverFiveSeconds, () -> { + if (M.ms() - lastUse.get(oldestOverFiveSeconds) >= adjustedIdleDuration.get()) { + toUnload.add(oldestOverFiveSeconds); + fakeToUnload.getAndAdd(1); + Iris.debug("Oldest Tectonic Region over 5 seconds idle added to unload"); + dummyLoadedRegions.getAndDecrement(); + } + })); - if (oldestOverFiveSeconds != null) { - Set finalToUnload = toUnload; - hyperLock.withLong(oldestOverFiveSeconds, () -> { - if (M.ms() - lastUse.get(oldestOverFiveSeconds) >= adjustedIdleDuration.get()) { - finalToUnload.add(oldestOverFiveSeconds); - fakeToUnload.getAndAdd(1); - Iris.debug("Oldest Tectonic Region over 5 seconds idle added to unload"); - dummyLoadedRegions.getAndDecrement(); - } - }); - } } catch (Exception e) { } } } - // BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(1), toUnload.size()); + // BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(1), toUnload.size()); for (Long i : toUnload) { - // burstExecutor.queue(() -> { - hyperLock.withLong(i, () -> { - TectonicPlate m = loadedRegions.get(i); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, i)); - loadedRegions.remove(i); - lastUse.remove(i); - fakeToUnload.getAndAdd(-1); - Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - } catch (IOException e) { - e.printStackTrace(); - } + // burstExecutor.queue(() -> { + hyperLock.withLong(i, () -> { + TectonicPlate m = loadedRegions.get(i); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, i)); + loadedRegions.remove(i); + lastUse.remove(i); + fakeToUnload.getAndAdd(-1); + Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); + } catch (IOException e) { + e.printStackTrace(); } - }); - // }); + } + }); + // }); } - // burstExecutor.complete(); + // burstExecutor.complete(); } finally { io.set(false); @@ -673,4 +668,4 @@ public class Mantle { public boolean shouldReduce(Engine engine) { return !engine.isStudio() || IrisSettings.get().getPerformance().isTrimMantleInStudio(); } -} +} \ No newline at end of file From c30de984496f03a6df117b3f7be59f0c5ae83468 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 26 Nov 2023 19:02:50 +0100 Subject: [PATCH 11/66] e --- .../main/java/com/volmit/iris/util/mantle/Mantle.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) 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 72af5f2fc..af609ffda 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 @@ -443,7 +443,6 @@ public class Mantle { dynamicThreads.set(IrisSettings.get().getPerformance().getTectonicUnloadThreads()); } } - int dth = dynamicThreads.get(); adjustedIdleDuration.set(baseIdleDuration); @@ -501,10 +500,10 @@ public class Mantle { } } - // BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(1), toUnload.size()); + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(dynamicThreads.get()), toUnload.size()); for (Long i : toUnload) { - // burstExecutor.queue(() -> { + burstExecutor.queue(() -> { hyperLock.withLong(i, () -> { TectonicPlate m = loadedRegions.get(i); if (m != null) { @@ -519,10 +518,9 @@ public class Mantle { } } }); - // }); + }); } - // burstExecutor.complete(); - + burstExecutor.complete(); } finally { io.set(false); } From 0c179eae866ea0ee633eaa9fea5385516b3aa976 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 26 Nov 2023 19:42:25 +0100 Subject: [PATCH 12/66] e --- .../com/volmit/iris/core/service/DynamicPerformanceSVC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index 4d28dc414..e58add180 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -69,7 +69,7 @@ public class DynamicPerformanceSVC implements IrisService { tectonicLimit.getAndAdd(1); t = t - 250; } - tectonicLimit.set(10); + // tectonicLimit.set(10); } } From 81776e60fb17001fedd6fb08acc69bb88c43f1c3 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 10:31:44 +0100 Subject: [PATCH 13/66] So now it actually it works --- .../iris/core/commands/CommandDeveloper.java | 2 + .../core/service/DynamicPerformanceSVC.java | 27 +++------- .../com/volmit/iris/util/mantle/Mantle.java | 53 ++++++++++--------- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 57e1809a0..41702d04f 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; @@ -61,6 +62,7 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize)); + Iris.info(C.DARK_PURPLE + "Agressive Unload: " + C.LIGHT_PURPLE + IrisSettings.get().getPerformance().AggressiveTectonicUnload); Iris.info("-------------------------"); } else { Iris.info(C.RED + "Engine is null!"); diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index e58add180..1b9276d93 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -1,33 +1,15 @@ package com.volmit.iris.core.service; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.util.SFG.WorldHandlerSFG; -import com.volmit.iris.util.format.C; import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.math.M; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.scheduling.Looper; -import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.nio.file.*; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static com.volmit.iris.util.mantle.Mantle.*; -import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; +import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; public class DynamicPerformanceSVC implements IrisService { private JavaPlugin plugin; @@ -50,7 +32,10 @@ public class DynamicPerformanceSVC implements IrisService { @Override protected long loop() { try { - + if (engine.getMantle().getTectonicLimit() < engine.getMantle().getLoadedRegionCount()){ + engine.getMantle().trim(5); + return 2000; + } } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -69,7 +54,7 @@ public class DynamicPerformanceSVC implements IrisService { tectonicLimit.getAndAdd(1); t = t - 250; } - // tectonicLimit.set(10); + tectonicLimit.set(10); } } 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 af609ffda..c6675f76d 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 @@ -42,17 +42,16 @@ import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; import lombok.Getter; import org.bukkit.Chunk; +import org.checkerframework.checker.units.qual.A; import java.io.EOFException; import java.io.File; import java.io.IOException; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; /** * The mantle can store any type of data slice anywhere and manage regions & IO on it's own. @@ -400,6 +399,8 @@ public class Mantle { private final AtomicInteger dynamicThreads = new AtomicInteger(1); @Getter private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); + @Getter + private final AtomicLong oldestTectonicPlate = new AtomicLong(0); private int g = 0; /** @@ -412,7 +413,7 @@ public class Mantle { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } - if (forceAggressiveThreshold.get() <= -1) { + if (forceAggressiveThreshold.get() != -1) { forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); } else { forceAggressiveThreshold.set(tectonicLimit.get()); @@ -473,30 +474,34 @@ public class Mantle { }); } - if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > tectonicLimit.get() && tectonicLimit.get() > forceAggressiveThreshold.get()) { - AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); + if (IrisSettings.get().getPerformance().AggressiveTectonicUnload + && loadedRegions.size() > forceAggressiveThreshold.get()) { - while (dummyLoadedRegions.get() > tectonicLimit.get()) { - try { - long fiveSecondsAgo = M.ms() - 5000; - toUnload.clear(); + while (loadedRegions.size() > tectonicLimit.get()) { + Long[] oldestKey = {null}; + long[] oldestAge = {Long.MIN_VALUE}; - lastUse.entrySet().stream() - .filter(e -> e.getValue() < fiveSecondsAgo) - .max(Comparator.comparingLong(Map.Entry::getValue)) - .map(Map.Entry::getKey) - .ifPresent(oldestOverFiveSeconds -> hyperLock.withLong(oldestOverFiveSeconds, () -> { - if (M.ms() - lastUse.get(oldestOverFiveSeconds) >= adjustedIdleDuration.get()) { - toUnload.add(oldestOverFiveSeconds); - fakeToUnload.getAndAdd(1); - Iris.debug("Oldest Tectonic Region over 5 seconds idle added to unload"); - dummyLoadedRegions.getAndDecrement(); - } - })); + for (Long key : lastUse.keySet()) { + long age = M.ms() - lastUse.get(key); + if (age > oldestAge[0]) { + oldestAge[0] = age; + oldestKey[0] = key; + } + } - } catch (Exception e) { + if (oldestKey[0] != null) { + Long finalOldestKey = oldestKey[0]; // Create a final variable for use in the lambda + hyperLock.withLong(finalOldestKey, () -> { + toUnload.add(finalOldestKey); + fakeToUnload.addAndGet(1); + Iris.info("Oldest Tectonic Region " + finalOldestKey + " added to unload"); + // Remove the region from loadedRegions and lastUse + loadedRegions.remove(finalOldestKey); + lastUse.remove(finalOldestKey); + }); } + } } From de261a38fda595d69406e6b4002fed64a9f0932a Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 10:39:48 +0100 Subject: [PATCH 14/66] o --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 c6675f76d..7c780de52 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 @@ -420,6 +420,7 @@ public class Mantle { } if(IrisSettings.get().getPerformance().dynamicPerformanceMode) { + // todo Repixel improve the logic int h = dynamicThreads.get() - 1; if (fakeToUnload.get() != 0) { if (fakeToUnload.get() > oldFakeToUnload.get()) { @@ -469,7 +470,7 @@ public class Mantle { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { toUnload.add(i); fakeToUnload.addAndGet(1); - Iris.debug("Tectonic Region added to unload"); + Iris.info("Tectonic Region added to unload"); } }); } From 1044f901bdde37144f6b6a2fb5e3d5bb1408ee9c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 10:41:48 +0100 Subject: [PATCH 15/66] o --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 7c780de52..ec68e7820 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 @@ -491,13 +491,12 @@ public class Mantle { } if (oldestKey[0] != null) { - Long finalOldestKey = oldestKey[0]; // Create a final variable for use in the lambda + Long finalOldestKey = oldestKey[0]; hyperLock.withLong(finalOldestKey, () -> { toUnload.add(finalOldestKey); fakeToUnload.addAndGet(1); Iris.info("Oldest Tectonic Region " + finalOldestKey + " added to unload"); - // Remove the region from loadedRegions and lastUse loadedRegions.remove(finalOldestKey); lastUse.remove(finalOldestKey); }); From 205d9d528e0af0c39f0cd59cdfe4d9e72a15b1b0 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 10:47:45 +0100 Subject: [PATCH 16/66] back to debug --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 ec68e7820..3088361c0 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 @@ -470,7 +470,7 @@ public class Mantle { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { toUnload.add(i); fakeToUnload.addAndGet(1); - Iris.info("Tectonic Region added to unload"); + Iris.debug("Tectonic Region added to unload"); } }); } @@ -495,7 +495,7 @@ public class Mantle { hyperLock.withLong(finalOldestKey, () -> { toUnload.add(finalOldestKey); fakeToUnload.addAndGet(1); - Iris.info("Oldest Tectonic Region " + finalOldestKey + " added to unload"); + Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); loadedRegions.remove(finalOldestKey); lastUse.remove(finalOldestKey); @@ -516,7 +516,7 @@ public class Mantle { m.write(fileForRegion(dataFolder, i)); loadedRegions.remove(i); lastUse.remove(i); - fakeToUnload.getAndAdd(-1); + fakeToUnload.getAndDecrement(); Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); } catch (IOException e) { e.printStackTrace(); From f61247f8bbba64fefa6c907d06ceb1f3524e2530 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 11:31:26 +0100 Subject: [PATCH 17/66] Raw data --- .../core/service/DynamicPerformanceSVC.java | 2 +- .../iris/engine/mantle/EngineMantle.java | 2 +- .../com/volmit/iris/util/mantle/Mantle.java | 23 ++++++++----------- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index 1b9276d93..e10cbc6c2 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -33,7 +33,7 @@ public class DynamicPerformanceSVC implements IrisService { protected long loop() { try { if (engine.getMantle().getTectonicLimit() < engine.getMantle().getLoadedRegionCount()){ - engine.getMantle().trim(5); + // engine.getMantle().trim(5); return 2000; } } catch (Throwable e) { diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 5b46c4b8a..59fef608f 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -293,7 +293,7 @@ public interface EngineMantle extends IObjectPlacer { } default long getToUnload(){ - return getMantle().getFakeToUnload().get(); + return getMantle().getToUnload().size(); } default long getDynamicThreads(){ return getMantle().getDynamicThreads().get(); 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 3088361c0..a756b0938 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 @@ -389,8 +389,8 @@ public class Mantle { return numberOfEntries * bytesPerEntry; } - @Getter - private final AtomicInteger fakeToUnload = new AtomicInteger(0); + //@Getter + //private final AtomicInteger fakeToUnload = new AtomicInteger(0); private final AtomicInteger oldFakeToUnload = new AtomicInteger((0)); @Getter private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); @@ -401,6 +401,8 @@ public class Mantle { private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); @Getter private final AtomicLong oldestTectonicPlate = new AtomicLong(0); + @Getter + private final Set toUnload = new HashSet<>(); private int g = 0; /** @@ -422,8 +424,8 @@ public class Mantle { if(IrisSettings.get().getPerformance().dynamicPerformanceMode) { // todo Repixel improve the logic int h = dynamicThreads.get() - 1; - if (fakeToUnload.get() != 0) { - if (fakeToUnload.get() > oldFakeToUnload.get()) { + if (toUnload.size() != 0) { + if (toUnload.size() > oldFakeToUnload.get()) { g++; if (g >= 2 && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) > h && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) != h) { dynamicThreads.addAndGet(1); @@ -436,7 +438,7 @@ public class Mantle { dynamicThreads.addAndGet(-1); } } - oldFakeToUnload.set(fakeToUnload.get()); + oldFakeToUnload.set(toUnload.size()); } if (!IrisSettings.get().getPerformance().dynamicPerformanceMode){ if(IrisSettings.get().getPerformance().getTectonicUnloadThreads() <= -1){ @@ -461,7 +463,6 @@ public class Mantle { io.set(true); try { - final Set toUnload = new HashSet<>(); Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); for (Long i : lastUse.keySet()) { @@ -469,7 +470,6 @@ public class Mantle { hyperLock.withLong(i, () -> { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { toUnload.add(i); - fakeToUnload.addAndGet(1); Iris.debug("Tectonic Region added to unload"); } }); @@ -482,23 +482,21 @@ public class Mantle { Long[] oldestKey = {null}; long[] oldestAge = {Long.MIN_VALUE}; - for (Long key : lastUse.keySet()) { + for (Long key : lastUse.keySet()) { + if (!toUnload.contains(key)) { long age = M.ms() - lastUse.get(key); if (age > oldestAge[0]) { oldestAge[0] = age; oldestKey[0] = key; } } + } if (oldestKey[0] != null) { Long finalOldestKey = oldestKey[0]; hyperLock.withLong(finalOldestKey, () -> { toUnload.add(finalOldestKey); - fakeToUnload.addAndGet(1); Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); - - loadedRegions.remove(finalOldestKey); - lastUse.remove(finalOldestKey); }); } @@ -516,7 +514,6 @@ public class Mantle { m.write(fileForRegion(dataFolder, i)); loadedRegions.remove(i); lastUse.remove(i); - fakeToUnload.getAndDecrement(); Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); } catch (IOException e) { e.printStackTrace(); From 815b2235a2b3257742959b3efcab1f6b62211f56 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 13:48:58 +0100 Subject: [PATCH 18/66] FINALLY --- .../core/service/DynamicPerformanceSVC.java | 2 +- .../com/volmit/iris/util/mantle/Mantle.java | 61 ++++++++++--------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index e10cbc6c2..a289b2d87 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -34,7 +34,7 @@ public class DynamicPerformanceSVC implements IrisService { try { if (engine.getMantle().getTectonicLimit() < engine.getMantle().getLoadedRegionCount()){ // engine.getMantle().trim(5); - return 2000; + // return 2000; } } catch (Throwable e) { Iris.reportError(e); 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 a756b0938..f30c50f93 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 @@ -42,7 +42,6 @@ import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; import lombok.Getter; import org.bukkit.Chunk; -import org.checkerframework.checker.units.qual.A; import java.io.EOFException; import java.io.File; @@ -415,10 +414,10 @@ public class Mantle { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } - if (forceAggressiveThreshold.get() != -1) { - forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); - } else { + if (IrisSettings.get().getPerformance().getAggressiveTectonicThreshold() == -1) { forceAggressiveThreshold.set(tectonicLimit.get()); + } else { + forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); } if(IrisSettings.get().getPerformance().dynamicPerformanceMode) { @@ -431,7 +430,9 @@ public class Mantle { dynamicThreads.addAndGet(1); } } else { - g--; + if (g > 0) { + g--; + } } } else { if (dynamicThreads.get() >= 2) { @@ -478,18 +479,22 @@ public class Mantle { if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > forceAggressiveThreshold.get()) { - while (loadedRegions.size() > tectonicLimit.get()) { + AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); + + while (dummyLoadedRegions.get() > tectonicLimit.get()) { Long[] oldestKey = {null}; long[] oldestAge = {Long.MIN_VALUE}; for (Long key : lastUse.keySet()) { - if (!toUnload.contains(key)) { - long age = M.ms() - lastUse.get(key); - if (age > oldestAge[0]) { - oldestAge[0] = age; - oldestKey[0] = key; + hyperLock.withLong(key, () -> { + if (!toUnload.contains(key)) { + long age = M.ms() - lastUse.get(key); + if (age > oldestAge[0]) { + oldestAge[0] = age; + oldestKey[0] = key; + } } - } + }); } if (oldestKey[0] != null) { @@ -497,30 +502,30 @@ public class Mantle { hyperLock.withLong(finalOldestKey, () -> { toUnload.add(finalOldestKey); Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); + dummyLoadedRegions.getAndDecrement(); }); } - } } BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(dynamicThreads.get()), toUnload.size()); - - for (Long i : toUnload) { - burstExecutor.queue(() -> { - hyperLock.withLong(i, () -> { - TectonicPlate m = loadedRegions.get(i); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, i)); - loadedRegions.remove(i); - lastUse.remove(i); - Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - } catch (IOException e) { - e.printStackTrace(); + for (Long i : toUnload.toArray(Long[]::new)) { + burstExecutor.queue(() -> { + hyperLock.withLong(i, () -> { + TectonicPlate m = loadedRegions.get(i); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, i)); + loadedRegions.remove(i); + lastUse.remove(i); + toUnload.remove(i); + Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); + } catch (IOException e) { + e.printStackTrace(); + } } - } + }); }); - }); } burstExecutor.complete(); } finally { From 17f8fe69fbc91aedc1769e7858470c0bf445579f Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 14:43:06 +0100 Subject: [PATCH 19/66] so I didnt know that --- .../volmit/iris/core/commands/CommandDeveloper.java | 3 ++- .../iris/core/service/DynamicPerformanceSVC.java | 4 ++-- .../com/volmit/iris/engine/mantle/EngineMantle.java | 3 +++ .../main/java/com/volmit/iris/util/mantle/Mantle.java | 11 ++++++----- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 41702d04f..13f2cbb21 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -57,7 +57,8 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info(C.DARK_PURPLE + "Engine Status"); Iris.info(C.DARK_PURPLE + "Tectonic Threads: " + C.LIGHT_PURPLE + engine.getMantle().getDynamicThreads()); Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); - Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); + Iris.info(C.DARK_PURPLE + "Tectonic Loaded Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); + Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getNotClearedLoadedRegions()); Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload()); Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java index a289b2d87..1b9276d93 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java @@ -33,8 +33,8 @@ public class DynamicPerformanceSVC implements IrisService { protected long loop() { try { if (engine.getMantle().getTectonicLimit() < engine.getMantle().getLoadedRegionCount()){ - // engine.getMantle().trim(5); - // return 2000; + engine.getMantle().trim(5); + return 2000; } } catch (Throwable e) { Iris.reportError(e); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 59fef608f..1a22f797c 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -301,6 +301,9 @@ public interface EngineMantle extends IObjectPlacer { default double getTectonicLimit(){ return Mantle.tectonicLimit.get(); } + default long getNotClearedLoadedRegions(){ + return getMantle().getLoadedRegions().size() - getMantle().getToUnload().size(); + } default double getTectonicDuration(){ return getMantle().getAdjustedIdleDuration().get(); } 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 f30c50f93..2eda30e8d 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 @@ -388,8 +388,6 @@ public class Mantle { return numberOfEntries * bytesPerEntry; } - //@Getter - //private final AtomicInteger fakeToUnload = new AtomicInteger(0); private final AtomicInteger oldFakeToUnload = new AtomicInteger((0)); @Getter private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); @@ -479,9 +477,12 @@ public class Mantle { if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > forceAggressiveThreshold.get()) { - AtomicInteger dummyLoadedRegions = new AtomicInteger(loadedRegions.size()); + AtomicInteger regionCountToRemove = new AtomicInteger(0); + if (loadedRegions.size() > tectonicLimit.get()){ + regionCountToRemove.set(loadedRegions.size() - tectonicLimit.get()); + } - while (dummyLoadedRegions.get() > tectonicLimit.get()) { + for (; regionCountToRemove.get() > 0 ;) { Long[] oldestKey = {null}; long[] oldestAge = {Long.MIN_VALUE}; @@ -502,7 +503,7 @@ public class Mantle { hyperLock.withLong(finalOldestKey, () -> { toUnload.add(finalOldestKey); Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); - dummyLoadedRegions.getAndDecrement(); + regionCountToRemove.getAndDecrement(); }); } } From d473126d4c206763e7a92c3b66778812b8ccd185 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 16:16:11 +0100 Subject: [PATCH 20/66] What was this even meant to do? --- core/src/main/java/com/volmit/iris/Iris.java | 1 - .../iris/core/safeguard/ServerBootSFG.java | 32 ------------------- 2 files changed, 33 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 4b48913fe..331e466d1 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -475,7 +475,6 @@ public class Iris extends VolmitPlugin implements Listener { UtilsSFG.unstablePrompt(); autoStartStudio(); - ServerBootSFG.CheckIrisWorlds(); checkForBukkitWorlds(); IrisToolbelt.retainMantleDataForSlice(String.class.getCanonicalName()); IrisToolbelt.retainMantleDataForSlice(BlockData.class.getCanonicalName()); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 4aa78c7c8..e9cc61975 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -76,36 +76,4 @@ public class ServerBootSFG { Iris.safeguard("Unstable mode has been activated."); } } - public static void CheckIrisWorlds() { - StringJoiner joiner = new StringJoiner(", "); - - // Get the main server folder - File serverFolder = Bukkit.getWorldContainer(); - - // List all files in the server folder - File[] listOfFiles = serverFolder.listFiles(); - - if (listOfFiles != null) { - for (File file : listOfFiles) { - // Check if it is a directory (world folders are directories) - if (file.isDirectory()) { - // Check for an "iris" folder inside the world directory - File irisFolder = new File(file, "iris"); - if (irisFolder.exists() && irisFolder.isDirectory()) { - String worldName = file.getName(); - joiner.add(worldName); - - // Check if the world is already loaded - if (Bukkit.getWorld(worldName) == null) { - WorldHandlerSFG.LoadWorld(worldName); - } - } - } - } - } else { - Bukkit.getLogger().warning("No files found in the server folder."); - } - // No Idea what I should do with this - String worldsList = joiner.toString(); - } } From d830aa1d1a1943b154de3347971ce6feff43fe56 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 16:26:34 +0100 Subject: [PATCH 21/66] Bug when on intel cpu and unstable mode and moved more to SFG --- core/src/main/java/com/volmit/iris/Iris.java | 13 ++++++------- .../com/volmit/iris/core/safeguard/UtilsSFG.java | 10 ++++++++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 331e466d1..981085014 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -30,7 +30,6 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; -import com.volmit.iris.core.safeguard.ServerBootSFG; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.EnginePanic; @@ -469,10 +468,7 @@ public class Iris extends VolmitPlugin implements Listener { J.s(this::setupPapi); J.a(ServerConfigurator::configure, 20); splash(); - UtilsSFG.UnstableMode(); - UtilsSFG.SupportedServerSoftware(); - UtilsSFG.printIncompatibleWarnings(); - UtilsSFG.unstablePrompt(); + UtilsSFG.splash(); autoStartStudio(); checkForBukkitWorlds(); @@ -787,8 +783,11 @@ public class Iris extends VolmitPlugin implements Listener { if(unstablemode) Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel()); - if(getCPUModel().contains("Intel")) Iris.info("Server Cpu: " + C.BLUE + getCPUModel()); - if(getCPUModel().contains("Ryzen")) Iris.info("Server Cpu: " + C.RED + getCPUModel()); + if(getCPUModel().contains("Intel")) Iris.info("Server Cpu: " + C.BLUE + getCPUModel());else { + if (getCPUModel().contains("Ryzen")) Iris.info("Server Cpu: " + C.RED + getCPUModel()); else { + Iris.info("Server Cpu: " + C.DARK_GRAY + getCPUModel()); + } + } if(!getCPUModel().contains("Intel") && !getCPUModel().contains("Ryzen")) Iris.info("Server Cpu: " + C.DARK_GRAY + getCPUModel()); Iris.info("Process Threads: " + getCPUThreads()); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index 746512698..caf34bf86 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -5,14 +5,20 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; public class UtilsSFG { - public static void UnstableMode(){ + public static void splash(){ + UtilsSFG.unstableMode(); + UtilsSFG.supportedServerSoftware(); + UtilsSFG.printIncompatibleWarnings(); + UtilsSFG.unstablePrompt(); + } + public static void unstableMode(){ if (IrisSafeguard.unstablemode) { Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); } else { Iris.safeguard(C.BLUE + "Iris is running Stable"); } } - public static void SupportedServerSoftware(){ + public static void supportedServerSoftware(){ if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.DARK_RED + "Server is running unsupported server software"); Iris.safeguard(C.RED + "Supported: Purpur, Pufferfish, Paper, Spigot, Bukkit"); From 80d8449f029442320668c11a985e2bc1d5ba5b43 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 29 Nov 2023 18:04:56 +0100 Subject: [PATCH 22/66] Bug when on intel cpu and unstable mode and changed how SFG works --- core/src/main/java/com/volmit/iris/Iris.java | 26 ++++++--- .../iris/core/safeguard/IrisSafeguard.java | 1 + .../iris/core/safeguard/ServerBootSFG.java | 24 ++++---- .../iris/core/safeguard/UnstableModeSFG.java | 56 ++++++++++++++++++ .../volmit/iris/core/safeguard/UtilsSFG.java | 58 +------------------ 5 files changed, 92 insertions(+), 73 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 981085014..35c28a556 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -770,7 +770,6 @@ public class Iris extends VolmitPlugin implements Listener { }; String[] splash = unstablemode ? splashunstable : splashstable; // Choose the appropriate splash array based on unstablemode - OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); String osArch = osBean.getArch(); String osName = osBean.getName(); @@ -778,17 +777,30 @@ public class Iris extends VolmitPlugin implements Listener { if (!passedserversoftware) { Iris.info("Server type & version: " + C.RED + Bukkit.getVersion()); } else { Iris.info("Server type & version: " + Bukkit.getVersion()); } - + if (!instance.getServer().getVersion().contains("Purpur")) { + if (instance.getServer().getVersion().contains("Spigot") && instance.getServer().getVersion().contains("Bukkit")) { + Iris.info(C.RED + " Iris requires paper or above to function properly.."); + } else { + Iris.info(C.YELLOW + "Purpur is recommended to use with iris."); + } + } Iris.info("Server OS: " + osName + " (" + osArch + ")"); if(unstablemode) Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel()); - - if(getCPUModel().contains("Intel")) Iris.info("Server Cpu: " + C.BLUE + getCPUModel());else { - if (getCPUModel().contains("Ryzen")) Iris.info("Server Cpu: " + C.RED + getCPUModel()); else { - Iris.info("Server Cpu: " + C.DARK_GRAY + getCPUModel()); + try { + if (getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.BLUE + getCPUModel()); } + if (getCPUModel().contains("Ryzen")) { + Iris.info("Server Cpu: " + C.RED + getCPUModel()); + } + if (!getCPUModel().contains("Ryzen") && !getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.GRAY + getCPUModel()); + } + + } catch (Exception e){ + Iris.info("Server Cpu: " + C.DARK_RED + "Failed"); } - if(!getCPUModel().contains("Intel") && !getCPUModel().contains("Ryzen")) Iris.info("Server Cpu: " + C.DARK_GRAY + getCPUModel()); Iris.info("Process Threads: " + getCPUThreads()); Iris.info("Process Memory: " + getHardware.getProcessMemory() + " MB"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index a7d945dfc..f037d97cf 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -6,6 +6,7 @@ import com.volmit.iris.util.format.C; public class IrisSafeguard { public static boolean unstablemode = false; + public static boolean stablemode = false; public static void IrisSafeguardSystem() { Iris.info("Enabled Iris SafeGuard"); ServerBootSFG.BootCheck(); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index e9cc61975..2e8f14786 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -1,27 +1,26 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; -import com.volmit.iris.util.SFG.WorldHandlerSFG; import org.bukkit.Bukkit; -import org.bukkit.World; import org.bukkit.plugin.Plugin; -import java.io.File; import java.util.*; import static com.volmit.iris.Iris.instance; +import static com.volmit.iris.core.safeguard.IrisSafeguard.stablemode; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.core.tools.IrisToolbelt.access; public class ServerBootSFG { public static final Map incompatiblePlugins = new HashMap<>(); public static boolean unsuportedversion = false; protected static boolean safeguardPassed; public static boolean passedserversoftware = true; - protected static byte count; + protected static int count; + protected static byte severityLow; + protected static byte severityMedium; + protected static byte severityHigh; public static String allIncompatiblePlugins; public static void BootCheck() { @@ -40,7 +39,7 @@ public class ServerBootSFG { pluginName = plugin.getName(); Boolean flag = incompatiblePlugins.get(pluginName); if (flag != null && !flag) { - count++; + severityHigh++; incompatiblePlugins.put(pluginName, true); } } @@ -60,17 +59,22 @@ public class ServerBootSFG { { passedserversoftware = false; joiner.add("Server Software"); - count++; + severityHigh++; } if (INMS.get() instanceof NMSBinding1X) { unsuportedversion = true; joiner.add("Unsupported Minecraft Version"); - count++; + severityHigh++; } allIncompatiblePlugins = joiner.toString(); - safeguardPassed = (count == 0); + safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); + count = severityHigh + severityMedium + severityLow; + if(safeguardPassed){ + stablemode = true; + Iris.safeguard("Stable mode has been activated."); + } if(!safeguardPassed){ unstablemode = true; Iris.safeguard("Unstable mode has been activated."); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java new file mode 100644 index 000000000..3d3f5c190 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java @@ -0,0 +1,56 @@ +package com.volmit.iris.core.safeguard; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.util.format.C; + +public class UnstableModeSFG { + public static void selectMode(){ + if (IrisSafeguard.unstablemode) { + Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); + unstable(); + } else { + stable(); + } + } + public static void stable(){ + Iris.safeguard(C.BLUE + "Iris is running Stable"); + } + + public static void unstable() { + + UtilsSFG.printIncompatibleWarnings(); + + if (IrisSafeguard.unstablemode) { + Iris.info(""); + Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); + Iris.info(C.RED + "Iris is running in unstable mode which may cause the following issues:"); + Iris.info(C.DARK_RED + "Server Issues"); + Iris.info(C.RED + "- Server won't boot"); + Iris.info(C.RED + "- Data Loss"); + Iris.info(C.RED + "- Unexpected behavior."); + Iris.info(C.RED + "- And More..."); + Iris.info(C.DARK_RED + "World Issues"); + Iris.info(C.RED + "- Worlds can't load due to corruption."); + Iris.info(C.RED + "- Worlds may slowly corrupt until they can't load."); + Iris.info(C.RED + "- World data loss."); + Iris.info(C.RED + "- And More..."); + Iris.info(C.DARK_RED + "ATTENTION: " + C.RED + "While running Iris in unstable mode, you won't be eligible for support."); + Iris.info(C.DARK_RED + "CAUSE: " + C.RED + UtilsSFG.MSGIncompatibleWarnings()); + + if (IrisSettings.get().getGeneral().bootUnstable) { + Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); + } else { + Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreUnstable to true if you wish to proceed."); + while (true) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // Handle interruption + } + } + } + Iris.info(""); + } + } +} diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index caf34bf86..b026f8f02 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -1,29 +1,13 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; public class UtilsSFG { public static void splash(){ - UtilsSFG.unstableMode(); - UtilsSFG.supportedServerSoftware(); - UtilsSFG.printIncompatibleWarnings(); - UtilsSFG.unstablePrompt(); - } - public static void unstableMode(){ - if (IrisSafeguard.unstablemode) { - Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); - } else { - Iris.safeguard(C.BLUE + "Iris is running Stable"); - } - } - public static void supportedServerSoftware(){ - if (!ServerBootSFG.passedserversoftware) { - Iris.safeguard(C.DARK_RED + "Server is running unsupported server software"); - Iris.safeguard(C.RED + "Supported: Purpur, Pufferfish, Paper, Spigot, Bukkit"); - } + UnstableModeSFG.selectMode(); } + public static void printIncompatibleWarnings(){ // String SupportedIrisVersion = getDescription().getVersion(); //todo Automatic version @@ -31,7 +15,6 @@ public class UtilsSFG { Iris.safeguard(C.BLUE + "0 Conflicts found"); } else { Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); - IrisSafeguard.unstablemode = true; if (ServerBootSFG.incompatiblePlugins.get("Multiverse-Core")) { Iris.safeguard(C.RED + "Multiverse"); @@ -62,41 +45,4 @@ public class UtilsSFG { public static String MSGIncompatibleWarnings() { return ServerBootSFG.allIncompatiblePlugins; } - - - public static void unstablePrompt() { - if (IrisSafeguard.unstablemode) { - Iris.info(""); - Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); - Iris.info(C.RED + "Iris is running in unstable mode what may cause the following issues."); - Iris.info(C.DARK_RED + "Server Issues"); - Iris.info(C.RED + "- Server wont boot"); - Iris.info(C.RED + "- Data Loss"); - Iris.info(C.RED + "- Unexpected behavior."); - Iris.info(C.RED + "- And More.."); - Iris.info(C.DARK_RED + "World Issues"); - Iris.info(C.RED + "- Worlds cant load due to corruption.."); - Iris.info(C.RED + "- Worlds may slowly corrupt till they wont be able to load."); - Iris.info(C.RED + "- World data loss."); - Iris.info(C.RED + "- And More.."); - Iris.info(C.DARK_RED + "ATTENTION:" + C.RED + " While running iris in unstable mode you wont be eligible for support."); - Iris.info(C.DARK_RED + "CAUSE: " + C.RED + MSGIncompatibleWarnings()); - Iris.info(""); - if (IrisSettings.get().getGeneral().bootUnstable) { - Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); - } - - if (!IrisSettings.get().getGeneral().isBootUnstable()) { - Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreUnstable to true if you wish to proceed."); - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // No - } - } - } - Iris.info(""); - } - } } From 18a69e97b332d81c2b0a0739d651ae964c978b38 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 30 Nov 2023 10:19:57 +0100 Subject: [PATCH 23/66] not really lazy but oh well at least it fixed a crash --- .../core/pregenerator/LazyPregenerator.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index 7deeb181e..733e27100 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -2,6 +2,7 @@ package com.volmit.iris.core.pregenerator; import com.google.gson.Gson; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.IO; @@ -9,6 +10,8 @@ import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.math.Spiraler; +import com.volmit.iris.util.parallel.BurstExecutor; +import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import io.papermc.lib.PaperLib; @@ -22,6 +25,7 @@ import org.bukkit.event.world.WorldUnloadEvent; import java.io.File; import java.io.IOException; +import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -137,13 +141,16 @@ public class LazyPregenerator extends Thread implements Listener { } private void tickGenerate(Position2 chunk) { - if (PaperLib.isPaper()) { - PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk)); - } else { - J.s(() -> world.getChunkAt(chunk.getX(), chunk.getZ())); - Iris.verbose("Generated " + chunk); - } - lazyGeneratedChunks.addAndGet(1); + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(IrisSettings.get().getConcurrency().getParallelism()), lazyTotalChunks.get()); + burstExecutor.queue(() -> { + if (PaperLib.isPaper()) { + PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk)); + } else { + J.s(() -> world.getChunkAt(chunk.getX(), chunk.getZ())); + Iris.verbose("Generated " + chunk); + } + lazyGeneratedChunks.addAndGet(1); + }); } private void tickRegenerate(Position2 chunk) { From 8fc6e3b335606cbb89d7a79b5a4451074937ced2 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 3 Dec 2023 12:45:36 +0100 Subject: [PATCH 24/66] Dev code + added maxcpm for lazy gen --- core/src/main/java/com/volmit/iris/Iris.java | 1 + .../com/volmit/iris/core/IrisSettings.java | 1 + .../iris/core/commands/CommandPregen.java | 9 +++++- .../core/pregenerator/LazyPregenerator.java | 6 ++-- .../iris/core/safeguard/IrisSafeguard.java | 2 -- ...PerformanceSVC.java => IrisEngineSVC.java} | 21 ++++++++----- .../iris/core/service/WorldLoadSFG.java | 31 +++++++++++++++++++ 7 files changed, 58 insertions(+), 13 deletions(-) rename core/src/main/java/com/volmit/iris/core/service/{DynamicPerformanceSVC.java => IrisEngineSVC.java} (78%) create mode 100644 core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 35c28a556..9aa60164e 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -63,6 +63,7 @@ import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; import io.papermc.lib.PaperLib; +import lombok.Getter; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.serializer.ComponentSerializer; import org.bukkit.Bukkit; 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 f3ac56d5f..d06774c21 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -145,6 +145,7 @@ public class IrisSettings { public boolean dynamicPerformanceMode = true; public boolean AggressiveTectonicUnload = false; public int AggressiveTectonicThreshold = -1; // -1 = Disabled and instead uses the tectonicLimit + public int LazyPregenMaxCPM = -1; // -1 = no limit } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java index a9bc9ff7a..9a888b7a8 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.pregenerator.LazyPregenerator; import com.volmit.iris.core.pregenerator.PregenTask; @@ -78,12 +79,18 @@ public class CommandPregen implements DecreeExecutor { sender().sendMessage(C.RED + "The engine access for this world is null!"); sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example."); } + int cpm = 0; + if (IrisSettings.get().getPerformance().getLazyPregenMaxCPM() == -1) { + cpm = 999999999; + } else { + cpm = IrisSettings.get().getPerformance().getLazyPregenMaxCPM(); + } LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder() .world(worldName) .healingPosition(0) .healing(false) - .chunksPerMinute(999999999) + .chunksPerMinute(cpm) .radiusBlocks(radius) .position(0) .build(); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index 733e27100..47effb6d8 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -25,6 +25,7 @@ import org.bukkit.event.world.WorldUnloadEvent; import java.io.File; import java.io.IOException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -140,9 +141,10 @@ public class LazyPregenerator extends Thread implements Listener { ); } + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private void tickGenerate(Position2 chunk) { - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(IrisSettings.get().getConcurrency().getParallelism()), lazyTotalChunks.get()); - burstExecutor.queue(() -> { + executorService.submit(() -> { if (PaperLib.isPaper()) { PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk)); } else { diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index f037d97cf..2c06eef8e 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -1,8 +1,6 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.util.format.C; public class IrisSafeguard { public static boolean unstablemode = false; diff --git a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java similarity index 78% rename from core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java rename to core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 1b9276d93..382e49e77 100644 --- a/core/src/main/java/com/volmit/iris/core/service/DynamicPerformanceSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -2,40 +2,42 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.IrisWorld; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.scheduling.Looper; +import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.plugin.java.JavaPlugin; import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; -public class DynamicPerformanceSVC implements IrisService { +public class IrisEngineSVC implements IrisService { private JavaPlugin plugin; public Looper ticker; public Mantle mantle; - public Engine engine; + public final World IrisWorld = Bukkit.getWorld("test"); + // public Engine engine = IrisToolbelt.access(IrisWorld).getEngine(); @Override public void onEnable() { this.plugin = Iris.instance; if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { this.startupPerformance(); - this.DynamicPerformance(); + this.IrisEngine(); ticker.start(); } } - public void DynamicPerformance(){ + public void IrisEngine(){ ticker = new Looper() { @Override protected long loop() { try { - if (engine.getMantle().getTectonicLimit() < engine.getMantle().getLoadedRegionCount()){ - engine.getMantle().trim(5); - return 2000; - } + } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -57,6 +59,9 @@ public class DynamicPerformanceSVC implements IrisService { tectonicLimit.set(10); } } + public void getAllIrisWorlds(){ + + } @Override public void onDisable() { diff --git a/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java b/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java new file mode 100644 index 000000000..845edf054 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java @@ -0,0 +1,31 @@ +package com.volmit.iris.core.service; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.plugin.IrisService; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import static java.lang.System.getLogger; + +public class WorldLoadSFG implements IrisService { + private JavaPlugin plugin; + @EventHandler + public void onWorldLoad(WorldLoadEvent event) { + World world = event.getWorld(); + + } + + @Override + public void onEnable() { + this.plugin = Iris.instance; + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void onDisable() { + + } +} From 83e311870fc2e380397fd561e2515b386343bc70 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 3 Dec 2023 16:56:56 +0100 Subject: [PATCH 25/66] Sync --- .../com/volmit/iris/core/IrisSettings.java | 1 - .../iris/core/service/IrisEngineSVC.java | 73 +++++++++++++------ .../com/volmit/iris/util/mantle/Mantle.java | 7 +- 3 files changed, 53 insertions(+), 28 deletions(-) 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 d06774c21..5b69fa71f 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -142,7 +142,6 @@ public class IrisSettings { public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; public int tectonicUnloadThreads = -1; // -1 = Disabled and instead use the dynamic method - public boolean dynamicPerformanceMode = true; public boolean AggressiveTectonicUnload = false; public int AggressiveTectonicThreshold = -1; // -1 = Disabled and instead uses the tectonicLimit public int LazyPregenMaxCPM = -1; // -1 = no limit diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 382e49e77..067c6fde8 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -3,33 +3,49 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisWorld; -import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.mantle.TectonicPlate; +import com.volmit.iris.util.math.M; import com.volmit.iris.util.misc.getHardware; +import com.volmit.iris.util.parallel.BurstExecutor; +import com.volmit.iris.util.parallel.HyperLock; +import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.scheduling.Looper; +import io.papermc.lib.PaperLib; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; public class IrisEngineSVC implements IrisService { private JavaPlugin plugin; public Looper ticker; - public Mantle mantle; - public final World IrisWorld = Bukkit.getWorld("test"); - // public Engine engine = IrisToolbelt.access(IrisWorld).getEngine(); + public List IrisWorlds = new ArrayList<>(); + public List corruptedIrisWorlds = new ArrayList<>(); + @Override public void onEnable() { this.plugin = Iris.instance; - if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { - this.startupPerformance(); - this.IrisEngine(); - ticker.start(); - } + this.IrisStartup(); + this.IrisEngine(); + ticker.start(); } public void IrisEngine(){ @@ -37,7 +53,11 @@ public class IrisEngineSVC implements IrisService { @Override protected long loop() { try { + for (World world : IrisWorlds){ + Engine engine = IrisToolbelt.access(world).getEngine(); + + } } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -48,19 +68,30 @@ public class IrisEngineSVC implements IrisService { } }; } - public void startupPerformance(){ - if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { - tectonicLimit.set(2); - long t = getHardware.getProcessMemory(); - for (; t > 250; ) { - tectonicLimit.getAndAdd(1); - t = t - 250; - } - tectonicLimit.set(10); + public void IrisStartup(){ + tectonicLimit.set(2); + long t = getHardware.getProcessMemory(); + for (; t > 250; ) { + tectonicLimit.getAndAdd(1); + t = t - 250; } - } - public void getAllIrisWorlds(){ + tectonicLimit.set(10); // DEBUG CODE + for (World w : Bukkit.getServer().getWorlds()) { + File container = Bukkit.getWorldContainer(); + Bukkit.getWorldContainer(); + if(IrisToolbelt.access(w) != null){ + IrisWorlds.add(w); + } else { + File worldDirectory = new File(container, w.getName()); + File IrisWorldTest = new File(worldDirectory, "Iris"); + if (IrisWorldTest.exists()){ + if(IrisToolbelt.access(w) == null){ + corruptedIrisWorlds.add(w); + } + } + } + } } @Override 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 2eda30e8d..099c29cac 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 @@ -418,7 +418,6 @@ public class Mantle { forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); } - if(IrisSettings.get().getPerformance().dynamicPerformanceMode) { // todo Repixel improve the logic int h = dynamicThreads.get() - 1; if (toUnload.size() != 0) { @@ -438,24 +437,20 @@ public class Mantle { } } oldFakeToUnload.set(toUnload.size()); - } - if (!IrisSettings.get().getPerformance().dynamicPerformanceMode){ + if(IrisSettings.get().getPerformance().getTectonicUnloadThreads() <= -1){ dynamicThreads.set(1); } else { dynamicThreads.set(IrisSettings.get().getPerformance().getTectonicUnloadThreads()); } - } adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions != null) { if (loadedRegions.size() > tectonicLimit.get()) { // todo update this correctly and maybe do something when its above a 100% - if (IrisSettings.get().getPerformance().dynamicPerformanceMode) { int tectonicLimitValue = tectonicLimit.get(); adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); - } } } From b5c1e7e2da936a0f5f04d094e10e107fc3530ce3 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 6 Dec 2023 15:56:19 +0100 Subject: [PATCH 26/66] Sync --- .../iris/core/service/IrisEngineSVC.java | 13 +- .../com/volmit/iris/engine/IrisEngine.java | 1 - .../com/volmit/iris/util/mantle/Mantle.java | 164 +++++++++++------- 3 files changed, 107 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 067c6fde8..700c67bd4 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -5,6 +5,7 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; @@ -53,10 +54,15 @@ public class IrisEngineSVC implements IrisService { @Override protected long loop() { try { - for (World world : IrisWorlds){ + for (World world : IrisWorlds) { Engine engine = IrisToolbelt.access(world).getEngine(); - - + } + PlatformChunkGenerator generator = IrisToolbelt.access(Bukkit.getWorld("localmemtest")); + if (generator != null && generator.getEngine() != null) { + Engine engine = generator.getEngine(); + engine.getMantle().trim(); + } else { + Iris.info("localmemtest is nullmem"); } } catch (Throwable e) { Iris.reportError(e); @@ -68,6 +74,7 @@ public class IrisEngineSVC implements IrisService { } }; } + public void IrisStartup(){ tectonicLimit.set(2); long t = getHardware.getProcessMemory(); diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index ff9d712c3..4531754f4 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -418,7 +418,6 @@ public class IrisEngine implements Engine { J.a(() -> { try { - getMantle().trim(); getData().getObjectLoader().clean(); } catch (Throwable e) { Iris.reportError(e); 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 099c29cac..9f4678d7f 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 @@ -40,6 +40,7 @@ import com.volmit.iris.util.matter.MatterSlice; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; +import com.volmit.iris.util.scheduling.Looper; import lombok.Getter; import org.bukkit.Chunk; @@ -67,7 +68,9 @@ public class Mantle { private final KSet unload; private final AtomicBoolean closed; private final MultiBurst ioBurst; - private final AtomicBoolean io; + private final AtomicBoolean ioTrim; + private final AtomicBoolean ioTectonicUnload; + public Looper ticker; /** * Create a new mantle @@ -81,12 +84,19 @@ public class Mantle { this.closed = new AtomicBoolean(false); this.dataFolder = dataFolder; this.worldHeight = worldHeight; - this.io = new AtomicBoolean(false); + this.ioTrim = new AtomicBoolean(false); + this.ioTectonicUnload = new AtomicBoolean(false); dataFolder.mkdirs(); unload = new KSet<>(); loadedRegions = new KMap<>(); lastUse = new KMap<>(); ioBurst = MultiBurst.burst; + if (!ioTectonicUnload.get()) { + this.unloadTectonicPlate(); + if (!ticker.isAlive()) { + ticker.start(); + } + } Iris.debug("Opened The Mantle " + C.DARK_AQUA + dataFolder.getAbsolutePath()); } @@ -393,13 +403,13 @@ public class Mantle { private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); public static final AtomicInteger tectonicLimit = new AtomicInteger(30); @Getter - private final AtomicInteger dynamicThreads = new AtomicInteger(1); + private final AtomicInteger dynamicThreads = new AtomicInteger(4); @Getter private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); @Getter private final AtomicLong oldestTectonicPlate = new AtomicLong(0); @Getter - private final Set toUnload = new HashSet<>(); + public Set toUnload = new HashSet<>(); private int g = 0; /** @@ -412,6 +422,7 @@ public class Mantle { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } + Iris.info(C.BLUE + "TECTONIC TRIM HAS RUN"); if (IrisSettings.get().getPerformance().getAggressiveTectonicThreshold() == -1) { forceAggressiveThreshold.set(tectonicLimit.get()); } else { @@ -419,6 +430,7 @@ public class Mantle { } // todo Repixel improve the logic + /* int h = dynamicThreads.get() - 1; if (toUnload.size() != 0) { if (toUnload.size() > oldFakeToUnload.get()) { @@ -443,6 +455,7 @@ public class Mantle { } else { dynamicThreads.set(IrisSettings.get().getPerformance().getTectonicUnloadThreads()); } + */ adjustedIdleDuration.set(baseIdleDuration); @@ -454,79 +467,96 @@ public class Mantle { } } - io.set(true); - - try { - Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); - - for (Long i : lastUse.keySet()) { - double finalAdjustedIdleDuration = adjustedIdleDuration.get(); - hyperLock.withLong(i, () -> { - if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { - toUnload.add(i); - Iris.debug("Tectonic Region added to unload"); + ioTrim.set(true); + try { + Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); + if (lastUse != null) { + for (Long i : lastUse.keySet()) { + Long lastUseTime = lastUse.get(i); + if (lastUseTime != null) { + double finalAdjustedIdleDuration = adjustedIdleDuration.get(); + hyperLock.withLong(i, () -> { + if (M.ms() - lastUseTime >= finalAdjustedIdleDuration) { + toUnload.add(i); + Iris.debug("Tectonic Region added to unload"); + } + }); + } } - }); - } - - if (IrisSettings.get().getPerformance().AggressiveTectonicUnload - && loadedRegions.size() > forceAggressiveThreshold.get()) { - - AtomicInteger regionCountToRemove = new AtomicInteger(0); - if (loadedRegions.size() > tectonicLimit.get()){ - regionCountToRemove.set(loadedRegions.size() - tectonicLimit.get()); } - for (; regionCountToRemove.get() > 0 ;) { - Long[] oldestKey = {null}; - long[] oldestAge = {Long.MIN_VALUE}; + if (IrisSettings.get().getPerformance().AggressiveTectonicUnload + && loadedRegions.size() > forceAggressiveThreshold.get()) { - for (Long key : lastUse.keySet()) { - hyperLock.withLong(key, () -> { - if (!toUnload.contains(key)) { - long age = M.ms() - lastUse.get(key); - if (age > oldestAge[0]) { - oldestAge[0] = age; - oldestKey[0] = key; + AtomicInteger regionCountToRemove = new AtomicInteger(0); + if (loadedRegions.size() > tectonicLimit.get()) { + regionCountToRemove.set(loadedRegions.size() - tectonicLimit.get()); + } + + for (; regionCountToRemove.get() > 0; ) { + Long[] oldestKey = {null}; + long[] oldestAge = {Long.MIN_VALUE}; + + for (Long key : lastUse.keySet()) { + hyperLock.withLong(key, () -> { + if (!toUnload.contains(key)) { + long age = M.ms() - lastUse.get(key); + if (age > oldestAge[0]) { + oldestAge[0] = age; + oldestKey[0] = key; + } } - } - }); - } + }); + } - if (oldestKey[0] != null) { - Long finalOldestKey = oldestKey[0]; - hyperLock.withLong(finalOldestKey, () -> { - toUnload.add(finalOldestKey); - Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); - regionCountToRemove.getAndDecrement(); - }); + if (oldestKey[0] != null) { + Long finalOldestKey = oldestKey[0]; + hyperLock.withLong(finalOldestKey, () -> { + toUnload.add(finalOldestKey); + Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); + regionCountToRemove.getAndDecrement(); + }); + } } } + } finally { + ioTrim.set(false); } + } - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(dynamicThreads.get()), toUnload.size()); - for (Long i : toUnload.toArray(Long[]::new)) { - burstExecutor.queue(() -> { - hyperLock.withLong(i, () -> { - TectonicPlate m = loadedRegions.get(i); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, i)); - loadedRegions.remove(i); - lastUse.remove(i); - toUnload.remove(i); - Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - }); + protected void unloadTectonicPlate() { + ticker = new Looper() { + protected long loop() { + try { + Iris.info(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(dynamicThreads.get()), toUnload.size()); + for (Long i : toUnload.toArray(Long[]::new)) { + burstExecutor.queue(() -> { + hyperLock.withLong(i, () -> { + TectonicPlate m = loadedRegions.get(i); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, i)); + loadedRegions.remove(i); + lastUse.remove(i); + toUnload.remove(i); + Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + }); + } + burstExecutor.complete(); + } catch (Exception e){ + Iris.reportError(e); + return -1; + } + return 1000; } - burstExecutor.complete(); - } finally { - io.set(false); - } + }; + ioTectonicUnload.set(true); } /** @@ -539,7 +569,7 @@ public class Mantle { */ @RegionCoordinates private TectonicPlate get(int x, int z) { - if (io.get()) { + if (ioTrim.get()) { try { return getSafe(x, z).get(); } catch (InterruptedException e) { From 6494cded628d0ae2c50961d4f8259f875f5f793e Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 10:41:17 +0100 Subject: [PATCH 27/66] Sync --- .../com/volmit/iris/util/mantle/Mantle.java | 73 +++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) 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 9f4678d7f..808c872d7 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 @@ -471,20 +471,21 @@ public class Mantle { try { Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); if (lastUse != null) { - for (Long i : lastUse.keySet()) { - Long lastUseTime = lastUse.get(i); - if (lastUseTime != null) { - double finalAdjustedIdleDuration = adjustedIdleDuration.get(); - hyperLock.withLong(i, () -> { - if (M.ms() - lastUseTime >= finalAdjustedIdleDuration) { - toUnload.add(i); - Iris.debug("Tectonic Region added to unload"); - } - }); - } + synchronized (lastUse) { // Synchronize access to lastUse ( GPT Code ) + for (Long i : new ArrayList<>(lastUse.keySet())) { // Use ArrayList to avoid ConcurrentModificationException + double finalAdjustedIdleDuration = adjustedIdleDuration.get(); + hyperLock.withLong(i, () -> { + Long lastUseTime = lastUse.get(i); // Move the get inside the lock + if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) { + toUnload.add(i); + Iris.debug("Tectonic Region added to unload"); + } + }); + } } } + if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > forceAggressiveThreshold.get()) { @@ -529,27 +530,40 @@ public class Mantle { protected long loop() { try { Iris.info(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); - BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(dynamicThreads.get()), toUnload.size()); - for (Long i : toUnload.toArray(Long[]::new)) { - burstExecutor.queue(() -> { - hyperLock.withLong(i, () -> { - TectonicPlate m = loadedRegions.get(i); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, i)); - loadedRegions.remove(i); - lastUse.remove(i); - toUnload.remove(i); - Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - } catch (IOException e) { - e.printStackTrace(); + int threadCount = 1; + ExecutorService executorService = Executors.newFixedThreadPool(threadCount); + List toUnloadList = new ArrayList<>(toUnload); + + int chunkSize = (int) Math.ceil(toUnloadList.size() / (double) threadCount); + + for (int i = 0; i < threadCount; i++) { + int start = i * chunkSize; + int end = Math.min(start + chunkSize, toUnloadList.size()); + List sublist = toUnloadList.subList(start, end); + + executorService.submit(() -> { + for (Long id : sublist) { + hyperLock.withLong(id, () -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnload.remove(id); + Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + } catch (IOException e) { + e.printStackTrace(); + } } - } - }); + }); + } }); } - burstExecutor.complete(); - } catch (Exception e){ + + executorService.shutdown(); + executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); + } catch (Exception e) { Iris.reportError(e); return -1; } @@ -559,6 +573,7 @@ public class Mantle { ioTectonicUnload.set(true); } + /** * This retreives a future of the Tectonic Plate at the given coordinates. * All methods accessing tectonic plates should go through this method From db43bc300ecbde024747a075882c8a6162dabc0e Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 11:26:14 +0100 Subject: [PATCH 28/66] Sync --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 808c872d7..7df45363e 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 @@ -471,21 +471,18 @@ public class Mantle { try { Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); if (lastUse != null) { - synchronized (lastUse) { // Synchronize access to lastUse ( GPT Code ) - for (Long i : new ArrayList<>(lastUse.keySet())) { // Use ArrayList to avoid ConcurrentModificationException + for (Long i : new ArrayList<>(lastUse.keySet())) { double finalAdjustedIdleDuration = adjustedIdleDuration.get(); hyperLock.withLong(i, () -> { - Long lastUseTime = lastUse.get(i); // Move the get inside the lock + Long lastUseTime = lastUse.get(i); if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) { toUnload.add(i); Iris.debug("Tectonic Region added to unload"); } }); } - } } - if (IrisSettings.get().getPerformance().AggressiveTectonicUnload && loadedRegions.size() > forceAggressiveThreshold.get()) { From ac4c00d3f2109ad91dfdc1265d40b74e5f79960a Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 14:27:08 +0100 Subject: [PATCH 29/66] Thanks Crazydev! --- .../core/pregenerator/LazyPregenerator.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index 47effb6d8..b53bfcc03 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -25,6 +25,7 @@ import org.bukkit.event.world.WorldUnloadEvent; import java.io.File; import java.io.IOException; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -145,12 +146,23 @@ public class LazyPregenerator extends Thread implements Listener { private void tickGenerate(Position2 chunk) { executorService.submit(() -> { + CountDownLatch latch = new CountDownLatch(1); if (PaperLib.isPaper()) { - PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true).thenAccept((i) -> Iris.verbose("Generated Async " + chunk)); + PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true) + .thenAccept((i) -> { + Iris.verbose("Generated Async " + chunk); + latch.countDown(); + }); } else { - J.s(() -> world.getChunkAt(chunk.getX(), chunk.getZ())); - Iris.verbose("Generated " + chunk); + J.s(() -> { + world.getChunkAt(chunk.getX(), chunk.getZ()); + Iris.verbose("Generated " + chunk); + latch.countDown(); + }); } + try { + latch.await(); + } catch (InterruptedException ignored) {} lazyGeneratedChunks.addAndGet(1); }); } From 306a1948cfe923a5622a948e1606db2d71c6591a Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 16:04:40 +0100 Subject: [PATCH 30/66] - Moved iris regen to studio - Moved Iris LazyPregen into its own cmd - Fixed the mem leak "i hope" - Added Silent option to the lazy pregen --- .../com/volmit/iris/core/IrisSettings.java | 1 - .../iris/core/commands/CommandIris.java | 72 +------------- .../iris/core/commands/CommandLazyPregen.java | 99 +++++++++++++++++++ .../iris/core/commands/CommandPregen.java | 87 ++++------------ .../iris/core/commands/CommandStudio.java | 80 +++++++++++++++ .../core/pregenerator/LazyPregenerator.java | 7 +- .../com/volmit/iris/util/mantle/Mantle.java | 42 ++------ 7 files changed, 214 insertions(+), 174 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java 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 5b69fa71f..60b691807 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -144,7 +144,6 @@ public class IrisSettings { public int tectonicUnloadThreads = -1; // -1 = Disabled and instead use the dynamic method public boolean AggressiveTectonicUnload = false; public int AggressiveTectonicThreshold = -1; // -1 = Disabled and instead uses the tectonicLimit - public int LazyPregenMaxCPM = -1; // -1 = no limit } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index b36b6e294..76c2af063 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -62,6 +62,7 @@ import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatiblePlugins; public class CommandIris implements DecreeExecutor { private CommandStudio studio; private CommandPregen pregen; + private CommandLazyPregen lazyPregen; private CommandSettings settings; private CommandObject object; private CommandJigsaw jigsaw; @@ -369,77 +370,6 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.GREEN + "Hotloaded settings"); } - @Decree(name = "regen", description = "Regenerate nearby chunks.", aliases = "rg", sync = true, origin = DecreeOrigin.PLAYER) - public void regen( - @Param(name = "radius", description = "The radius of nearby cunks", defaultValue = "5") - int radius - ) { - if (IrisToolbelt.isIrisWorld(player().getWorld())) { - VolmitSender sender = sender(); - J.a(() -> { - DecreeContext.touch(sender); - PlatformChunkGenerator plat = IrisToolbelt.access(player().getWorld()); - Engine engine = plat.getEngine(); - try { - Chunk cx = player().getLocation().getChunk(); - KList js = new KList<>(); - BurstExecutor b = MultiBurst.burst.burst(); - b.setMulticore(false); - int rad = engine.getMantle().getRealRadius(); - for (int i = -(radius + rad); i <= radius + rad; i++) { - for (int j = -(radius + rad); j <= radius + rad; j++) { - engine.getMantle().getMantle().deleteChunk(i + cx.getX(), j + cx.getZ()); - } - } - - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - int finalJ = j; - int finalI = i; - b.queue(() -> plat.injectChunkReplacement(player().getWorld(), finalI + cx.getX(), finalJ + cx.getZ(), (f) -> { - synchronized (js) { - js.add(f); - } - })); - } - } - - b.complete(); - sender().sendMessage(C.GREEN + "Regenerating " + Form.f(js.size()) + " Sections"); - QueueJob r = new QueueJob<>() { - final KList> futures = new KList<>(); - - @Override - public void execute(Runnable runnable) { - futures.add(J.sfut(runnable)); - - if (futures.size() > 64) { - while (futures.isNotEmpty()) { - try { - futures.remove(0).get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - } - } - - @Override - public String getName() { - return "Regenerating"; - } - }; - r.queue(js); - r.execute(sender()); - } catch (Throwable e) { - sender().sendMessage("Unable to parse view-distance"); - } - }); - } else { - sender().sendMessage(C.RED + "You must be in an Iris World to use regen!"); - } - } - @Decree(description = "Update the pack of a world (UNSAFE!)", name = "^world", aliases = "update-world") public void updateWorld( @Param(description = "The world to update", contextual = true) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java new file mode 100644 index 000000000..cc1c7f6aa --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java @@ -0,0 +1,99 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.core.commands; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.core.pregenerator.LazyPregenerator; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.decree.DecreeExecutor; +import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.math.Position2; +import org.bukkit.World; +import org.bukkit.util.Vector; + +import java.io.File; + +@Decree(name = "lazypregen", aliases = "lazy", description = "Pregenerate your Iris worlds!") +public class CommandLazyPregen implements DecreeExecutor { + @Decree(description = "Pregenerate a world") + public void start( + @Param(description = "The radius of the pregen in blocks", aliases = "size") + int radius, + @Param(description = "The world to pregen", contextual = true) + World world, + @Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0") + Vector center, + @Param(aliases = "maxcpm", description = "Limit the chunks per minute the pregen will generate", defaultValue = "999999999") + int cpm, + @Param(aliases = "maxcpm", description = "Limit the chunks per minute the pregen will generate", defaultValue = "false") + boolean dummySilent + ) { + String worldName = world.getName(); + try { + if (sender().isPlayer() && access() == null) { + sender().sendMessage(C.RED + "The engine access for this world is null!"); + sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example."); + } + + LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder() + .world(worldName) + .healingPosition(0) + .healing(false) + .chunksPerMinute(cpm) + .radiusBlocks(radius) + .position(0) + .silent(dummySilent) + .build(); + + LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, new File("plugins/Iris/lazygen.json")); + pregenerator.start(); + + String msg = C.GREEN + "LazyPregen started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); + sender().sendMessage(msg); + Iris.info(msg); + } catch (Throwable e) { + sender().sendMessage(C.RED + "Epic fail. See console."); + Iris.reportError(e); + e.printStackTrace(); + } + } + + @Decree(description = "Stop the active pregeneration task", aliases = "x") + public void stop() { + if (PregeneratorJob.shutdownInstance()) { + Iris.info( C.BLUE + "Finishing up mca region..."); + } else { + sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop"); + } + } + + @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"}) + public void pause() { + if (PregeneratorJob.pauseResume()) { + sender().sendMessage(C.GREEN + "Paused/unpaused pregeneration task, now: " + (PregeneratorJob.isPaused() ? "Paused" : "Running") + "."); + } else { + sender().sendMessage(C.YELLOW + "No active pregeneration tasks to pause/unpause."); + } + } +} diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java index 9a888b7a8..73f93091d 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java @@ -44,74 +44,29 @@ public class CommandPregen implements DecreeExecutor { @Param(description = "The world to pregen", contextual = true) World world, @Param(aliases = "middle", description = "The center location of the pregen. Use \"me\" for your current location", defaultValue = "0,0") - Vector center, - @Param(aliases = "method", description = "The pregen method that will get used. Lazy or Async", defaultValue = "async") - String method - ) { - if(method.equals("async") || method.equals("lazy")){ - if (method.equalsIgnoreCase("async")) { - try { - if (sender().isPlayer() && access() == null) { - sender().sendMessage(C.RED + "The engine access for this world is null!"); - sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example."); - } - radius = Math.max(radius, 1024); - int w = (radius >> 9 + 1) * 2; - IrisToolbelt.pregenerate(PregenTask - .builder() - .center(new Position2(center.getBlockX() >> 9, center.getBlockZ() >> 9)) - .width(w) - .height(w) - .build(), world); - String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); - sender().sendMessage(msg); - Iris.info(msg); - } catch (Throwable e) { - sender().sendMessage(C.RED + "Epic fail. See console."); - Iris.reportError(e); - e.printStackTrace(); - } + Vector center + ) { + try { + if (sender().isPlayer() && access() == null) { + sender().sendMessage(C.RED + "The engine access for this world is null!"); + sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example."); } - if (method.equalsIgnoreCase("lazy")) { - String worldName = world.getName(); - try { - if (sender().isPlayer() && access() == null) { - sender().sendMessage(C.RED + "The engine access for this world is null!"); - sender().sendMessage(C.RED + "Please make sure the world is loaded & the engine is initialized. Generate a new chunk, for example."); - } - int cpm = 0; - if (IrisSettings.get().getPerformance().getLazyPregenMaxCPM() == -1) { - cpm = 999999999; - } else { - cpm = IrisSettings.get().getPerformance().getLazyPregenMaxCPM(); - } - - LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder() - .world(worldName) - .healingPosition(0) - .healing(false) - .chunksPerMinute(cpm) - .radiusBlocks(radius) - .position(0) - .build(); - - LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, new File("plugins/Iris/lazygen.json")); - pregenerator.start(); - - String msg = C.GREEN + "Pregen started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); - sender().sendMessage(msg); - Iris.info(msg); - } catch (Throwable e) { - sender().sendMessage(C.RED + "Epic fail. See console."); - Iris.reportError(e); - e.printStackTrace(); - } - } - } else { - sender().sendMessage(C.RED + "Please use a valid method."); - + radius = Math.max(radius, 1024); + int w = (radius >> 9 + 1) * 2; + IrisToolbelt.pregenerate(PregenTask + .builder() + .center(new Position2(center.getBlockX() >> 9, center.getBlockZ() >> 9)) + .width(w) + .height(w) + .build(), world); + String msg = C.GREEN + "Pregen started in " + C.GOLD + world.getName() + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); + sender().sendMessage(msg); + Iris.info(msg); + } catch (Throwable e) { + sender().sendMessage(C.RED + "Epic fail. See console."); + Iris.reportError(e); + e.printStackTrace(); } - } @Decree(description = "Stop the active pregeneration task", aliases = "x") diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index 16405436c..41a271c57 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -29,9 +29,11 @@ import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.*; +import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; @@ -48,8 +50,13 @@ import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.math.Spiraler; import com.volmit.iris.util.noise.CNG; +import com.volmit.iris.util.parallel.BurstExecutor; +import com.volmit.iris.util.parallel.MultiBurst; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.O; import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import com.volmit.iris.util.scheduling.jobs.QueueJob; import io.papermc.lib.PaperLib; import org.bukkit.*; import org.bukkit.event.inventory.InventoryType; @@ -67,6 +74,8 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import java.util.function.Supplier; @Decree(name = "studio", aliases = {"std", "s"}, description = "Studio Commands", studio = true) @@ -143,6 +152,77 @@ public class CommandStudio implements DecreeExecutor { sender().sendMessage(C.GREEN + "The \"" + dimension.getName() + "\" pack has version: " + dimension.getVersion()); } + @Decree(name = "regen", description = "Regenerate nearby chunks.", aliases = "rg", sync = true, origin = DecreeOrigin.PLAYER) + public void regen( + @Param(name = "radius", description = "The radius of nearby cunks", defaultValue = "5") + int radius + ) { + if (IrisToolbelt.isIrisWorld(player().getWorld())) { + VolmitSender sender = sender(); + J.a(() -> { + DecreeContext.touch(sender); + PlatformChunkGenerator plat = IrisToolbelt.access(player().getWorld()); + Engine engine = plat.getEngine(); + try { + Chunk cx = player().getLocation().getChunk(); + KList js = new KList<>(); + BurstExecutor b = MultiBurst.burst.burst(); + b.setMulticore(false); + int rad = engine.getMantle().getRealRadius(); + for (int i = -(radius + rad); i <= radius + rad; i++) { + for (int j = -(radius + rad); j <= radius + rad; j++) { + engine.getMantle().getMantle().deleteChunk(i + cx.getX(), j + cx.getZ()); + } + } + + for (int i = -radius; i <= radius; i++) { + for (int j = -radius; j <= radius; j++) { + int finalJ = j; + int finalI = i; + b.queue(() -> plat.injectChunkReplacement(player().getWorld(), finalI + cx.getX(), finalJ + cx.getZ(), (f) -> { + synchronized (js) { + js.add(f); + } + })); + } + } + + b.complete(); + sender().sendMessage(C.GREEN + "Regenerating " + Form.f(js.size()) + " Sections"); + QueueJob r = new QueueJob<>() { + final KList> futures = new KList<>(); + + @Override + public void execute(Runnable runnable) { + futures.add(J.sfut(runnable)); + + if (futures.size() > 64) { + while (futures.isNotEmpty()) { + try { + futures.remove(0).get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + } + } + + @Override + public String getName() { + return "Regenerating"; + } + }; + r.queue(js); + r.execute(sender()); + } catch (Throwable e) { + sender().sendMessage("Unable to parse view-distance"); + } + }); + } else { + sender().sendMessage(C.RED + "You must be in an Iris World to use regen!"); + } + } + @Decree(description = "Convert objects in the \"convert\" folder") public void convert() { Iris.service(ConversionSVC.class).check(sender()); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index b53bfcc03..10d528c90 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -110,10 +110,11 @@ public class LazyPregenerator extends Thread implements Listener { generatedLast.set(lazyGeneratedChunks.get()); secondGenerated = secondGenerated / 6; chunksPerSecond.put(secondGenerated); - Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); + if (!job.isSilent()) { + Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); + } //Iris.info("Debug: " + maxPosition); //Iris.info("Debug1: " + job.getPosition()); - // todo: Maxpos borked } @@ -216,5 +217,7 @@ public class LazyPregenerator extends Thread implements Listener { private int radiusBlocks = 5000; @Builder.Default private int position = 0; + @Builder.Default + boolean silent = false; } } 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 7df45363e..d053f17bc 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 @@ -398,7 +398,6 @@ public class Mantle { return numberOfEntries * bytesPerEntry; } - private final AtomicInteger oldFakeToUnload = new AtomicInteger((0)); @Getter private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); public static final AtomicInteger tectonicLimit = new AtomicInteger(30); @@ -409,7 +408,7 @@ public class Mantle { @Getter private final AtomicLong oldestTectonicPlate = new AtomicLong(0); @Getter - public Set toUnload = new HashSet<>(); + public final Set toUnload = new HashSet<>(); private int g = 0; /** @@ -429,34 +428,6 @@ public class Mantle { forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); } - // todo Repixel improve the logic - /* - int h = dynamicThreads.get() - 1; - if (toUnload.size() != 0) { - if (toUnload.size() > oldFakeToUnload.get()) { - g++; - if (g >= 2 && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) > h && IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getParallelism()) != h) { - dynamicThreads.addAndGet(1); - } - } else { - if (g > 0) { - g--; - } - } - } else { - if (dynamicThreads.get() >= 2) { - dynamicThreads.addAndGet(-1); - } - } - oldFakeToUnload.set(toUnload.size()); - - if(IrisSettings.get().getPerformance().getTectonicUnloadThreads() <= -1){ - dynamicThreads.set(1); - } else { - dynamicThreads.set(IrisSettings.get().getPerformance().getTectonicUnloadThreads()); - } - */ - adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions != null) { @@ -525,11 +496,15 @@ public class Mantle { protected void unloadTectonicPlate() { ticker = new Looper() { protected long loop() { + long time = System.currentTimeMillis(); try { Iris.info(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); int threadCount = 1; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); - List toUnloadList = new ArrayList<>(toUnload); + List toUnloadList; + synchronized (toUnload) { + toUnloadList = new ArrayList<>(toUnload); + } int chunkSize = (int) Math.ceil(toUnloadList.size() / (double) threadCount); @@ -561,16 +536,15 @@ public class Mantle { executorService.shutdown(); executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (Exception e) { - Iris.reportError(e); + e.printStackTrace(); return -1; } - return 1000; + return Math.max(0, 1000-(System.currentTimeMillis()-time)); } }; ioTectonicUnload.set(true); } - /** * This retreives a future of the Tectonic Plate at the given coordinates. * All methods accessing tectonic plates should go through this method From 7d2062f298ec51092c08359ad584b6a15d17a5f6 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 16:06:33 +0100 Subject: [PATCH 31/66] e --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d053f17bc..ed4267554 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 @@ -462,7 +462,7 @@ public class Mantle { regionCountToRemove.set(loadedRegions.size() - tectonicLimit.get()); } - for (; regionCountToRemove.get() > 0; ) { + while (regionCountToRemove.get() > 0) { Long[] oldestKey = {null}; long[] oldestAge = {Long.MIN_VALUE}; From 9745f23fb2097ef4601762f934240ea5165c18cc Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 17:57:45 +0100 Subject: [PATCH 32/66] - Saving the LazyPregen Progress in world folder - Added option to pause to LazyPregen - Added option to stop to LazyPregen - Re-Added the functionality continue pregen on startup --- .../iris/core/commands/CommandLazyPregen.java | 28 +++++++++------ .../core/pregenerator/LazyPregenerator.java | 36 ++++++++++++++----- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java index cc1c7f6aa..f906056e9 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java @@ -29,6 +29,7 @@ import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.Position2; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.util.Vector; @@ -36,6 +37,7 @@ import java.io.File; @Decree(name = "lazypregen", aliases = "lazy", description = "Pregenerate your Iris worlds!") public class CommandLazyPregen implements DecreeExecutor { + public String worldName; @Decree(description = "Pregenerate a world") public void start( @Param(description = "The radius of the pregen in blocks", aliases = "size") @@ -46,10 +48,11 @@ public class CommandLazyPregen implements DecreeExecutor { Vector center, @Param(aliases = "maxcpm", description = "Limit the chunks per minute the pregen will generate", defaultValue = "999999999") int cpm, - @Param(aliases = "maxcpm", description = "Limit the chunks per minute the pregen will generate", defaultValue = "false") - boolean dummySilent + @Param(aliases = "silent", description = "Silent generation", defaultValue = "false") + boolean silent ) { - String worldName = world.getName(); + + worldName = world.getName(); try { if (sender().isPlayer() && access() == null) { sender().sendMessage(C.RED + "The engine access for this world is null!"); @@ -63,10 +66,12 @@ public class CommandLazyPregen implements DecreeExecutor { .chunksPerMinute(cpm) .radiusBlocks(radius) .position(0) - .silent(dummySilent) + .silent(silent) .build(); - LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, new File("plugins/Iris/lazygen.json")); + File worldDirectory = new File(Bukkit.getWorldContainer(), worldName); + File lazyGenFile = new File(worldDirectory, "lazygen.json"); + LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, lazyGenFile); pregenerator.start(); String msg = C.GREEN + "LazyPregen started in " + C.GOLD + worldName + C.GREEN + " of " + C.GOLD + (radius * 2) + C.GREEN + " by " + C.GOLD + (radius * 2) + C.GREEN + " blocks from " + C.GOLD + center.getX() + "," + center.getZ(); @@ -81,8 +86,9 @@ public class CommandLazyPregen implements DecreeExecutor { @Decree(description = "Stop the active pregeneration task", aliases = "x") public void stop() { - if (PregeneratorJob.shutdownInstance()) { - Iris.info( C.BLUE + "Finishing up mca region..."); + if (LazyPregenerator.getInstance() != null) { + LazyPregenerator.getInstance().shutdownInstance(); + Iris.info( C.BLUE + "Shutting down all Lazy Pregens"); } else { sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop"); } @@ -90,10 +96,12 @@ public class CommandLazyPregen implements DecreeExecutor { @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"}) public void pause() { - if (PregeneratorJob.pauseResume()) { - sender().sendMessage(C.GREEN + "Paused/unpaused pregeneration task, now: " + (PregeneratorJob.isPaused() ? "Paused" : "Running") + "."); + if (LazyPregenerator.getInstance() != null) { + LazyPregenerator.getInstance().setPausedLazy(); + sender().sendMessage(C.GREEN + "Paused/unpaused Lazy Pregen, now: " + (LazyPregenerator.getInstance().isPausedLazy() ? "Paused" : "Running") + "."); } else { - sender().sendMessage(C.YELLOW + "No active pregeneration tasks to pause/unpause."); + sender().sendMessage(C.YELLOW + "No active Lazy Pregen tasks to pause/unpause."); + } } } diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index 10d528c90..0883bd0a0 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -3,6 +3,7 @@ package com.volmit.iris.core.pregenerator; import com.google.gson.Gson; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.IO; @@ -14,9 +15,11 @@ import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; +import io.lumine.mythic.bukkit.utils.lib.jooq.False; import io.papermc.lib.PaperLib; import lombok.Builder; import lombok.Data; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.event.EventHandler; @@ -28,10 +31,13 @@ import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; public class LazyPregenerator extends Thread implements Listener { + @Getter + private static LazyPregenerator instance; private final LazyPregenJob job; private final File destination; private final int maxPosition; @@ -56,10 +62,8 @@ public class LazyPregenerator extends Thread implements Listener { chunksPerSecond = new RollingSequence(10); lazyGeneratedChunks = new AtomicInteger(0); generatedLast = new AtomicInteger(0); - lazyTotalChunks = new AtomicInteger(); - - int radius = job.getRadiusBlocks(); - lazyTotalChunks.set((int) Math.ceil(Math.pow((2.0 * radius) / 16, 2))); + lazyTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2))); + LazyPregenerator.instance = this; } public LazyPregenerator(File file) throws IOException { @@ -103,7 +107,7 @@ public class LazyPregenerator extends Thread implements Listener { } public void tick() { - if (latch.flip()) { + if (latch.flip() && !job.paused) { long eta = computeETA(); save(); int secondGenerated = lazyGeneratedChunks.get() - generatedLast.get(); @@ -113,9 +117,6 @@ public class LazyPregenerator extends Thread implements Listener { if (!job.isSilent()) { Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); } - //Iris.info("Debug: " + maxPosition); - //Iris.info("Debug1: " + job.getPosition()); - // todo: Maxpos borked } if (lazyGeneratedChunks.get() >= lazyTotalChunks.get()) { @@ -198,6 +199,23 @@ public class LazyPregenerator extends Thread implements Listener { } }); } + public void setPausedLazy(){ + if (!job.paused) { + save(); + Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world + C.BLUE + " Paused"); + job.setPaused(true); + } else { + Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world + C.BLUE + " Resumes"); + job.setPaused(false); + } + } + public boolean isPausedLazy(){ + return job.isPaused(); + } + public void shutdownInstance() { + save(); + interrupt(); + } public void saveNow() throws IOException { IO.writeAll(this.destination, new Gson().toJson(job)); @@ -219,5 +237,7 @@ public class LazyPregenerator extends Thread implements Listener { private int position = 0; @Builder.Default boolean silent = false; + @Builder.Default + boolean paused = false; } } From 57c647fa0ed073a45af4903c646bcf32ab2a434c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 7 Dec 2023 18:09:36 +0100 Subject: [PATCH 33/66] Whoops --- .../com/volmit/iris/core/pregenerator/LazyPregenerator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index 0883bd0a0..d299fd2ec 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -131,7 +131,9 @@ public class LazyPregenerator extends Thread implements Listener { } else { int pos = job.getPosition() + 1; job.setPosition(pos); - tickGenerate(getChunk(pos)); + if (!job.paused) { + tickGenerate(getChunk(pos)); + } } } From 54ae026c2b8cbf019335a563d2ff8bda118f4f33 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 15 Dec 2023 19:06:53 +0100 Subject: [PATCH 34/66] - Fixed LazyPregenerator.java and improved it. ( Speed decrease on server restart when lazy starts the job up dont know why) - Mem leak fix only works when there is 1 iris world for now ( working on it ) + A capped performance limit still very alpha like seems stable tho. - Disabled HotDropWorldSVC acts a bit weird sometimes. --- .../iris/core/commands/CommandLazyPregen.java | 28 +++- .../core/pregenerator/LazyPregenerator.java | 118 +++++++++---- .../iris/core/service/HotDropWorldSVC.java | 2 +- .../iris/core/service/IrisEngineSVC.java | 158 ++++++++++++------ .../iris/engine/mantle/EngineMantle.java | 3 + .../com/volmit/iris/util/mantle/Mantle.java | 19 +-- 6 files changed, 215 insertions(+), 113 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java index f906056e9..a3d4c622c 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandLazyPregen.java @@ -34,6 +34,7 @@ import org.bukkit.World; import org.bukkit.util.Vector; import java.io.File; +import java.io.IOException; @Decree(name = "lazypregen", aliases = "lazy", description = "Pregenerate your Iris worlds!") public class CommandLazyPregen implements DecreeExecutor { @@ -53,6 +54,14 @@ public class CommandLazyPregen implements DecreeExecutor { ) { worldName = world.getName(); + File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName()); + File lazyFile = new File(worldDirectory, "lazygen.json"); + if (lazyFile.exists()) { + sender().sendMessage(C.BLUE + "Lazy pregen is already in progress"); + Iris.info(C.YELLOW + "Lazy pregen is already in progress"); + return; + } + try { if (sender().isPlayer() && access() == null) { sender().sendMessage(C.RED + "The engine access for this world is null!"); @@ -69,7 +78,6 @@ public class CommandLazyPregen implements DecreeExecutor { .silent(silent) .build(); - File worldDirectory = new File(Bukkit.getWorldContainer(), worldName); File lazyGenFile = new File(worldDirectory, "lazygen.json"); LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, lazyGenFile); pregenerator.start(); @@ -85,20 +93,26 @@ public class CommandLazyPregen implements DecreeExecutor { } @Decree(description = "Stop the active pregeneration task", aliases = "x") - public void stop() { + public void stop( + @Param(aliases = "world", description = "The world to pause") + World world + ) throws IOException { if (LazyPregenerator.getInstance() != null) { - LazyPregenerator.getInstance().shutdownInstance(); - Iris.info( C.BLUE + "Shutting down all Lazy Pregens"); + LazyPregenerator.getInstance().shutdownInstance(world); + sender().sendMessage(C.LIGHT_PURPLE + "Closed lazygen instance for " + world.getName()); } else { sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop"); } } @Decree(description = "Pause / continue the active pregeneration task", aliases = {"t", "resume", "unpause"}) - public void pause() { + public void pause( + @Param(aliases = "world", description = "The world to pause") + World world + ) { if (LazyPregenerator.getInstance() != null) { - LazyPregenerator.getInstance().setPausedLazy(); - sender().sendMessage(C.GREEN + "Paused/unpaused Lazy Pregen, now: " + (LazyPregenerator.getInstance().isPausedLazy() ? "Paused" : "Running") + "."); + LazyPregenerator.getInstance().setPausedLazy(world); + sender().sendMessage(C.GREEN + "Paused/unpaused Lazy Pregen, now: " + (LazyPregenerator.getInstance().isPausedLazy(world) ? "Paused" : "Running") + "."); } else { sender().sendMessage(C.YELLOW + "No active Lazy Pregen tasks to pause/unpause."); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java index d299fd2ec..d3ee26b54 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/LazyPregenerator.java @@ -2,8 +2,6 @@ package com.volmit.iris.core.pregenerator; import com.google.gson.Gson; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.IO; @@ -11,11 +9,8 @@ import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.math.Spiraler; -import com.volmit.iris.util.parallel.BurstExecutor; -import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; -import io.lumine.mythic.bukkit.utils.lib.jooq.False; import io.papermc.lib.PaperLib; import lombok.Builder; import lombok.Data; @@ -25,23 +20,26 @@ import org.bukkit.World; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.HashMap; +import java.util.Map; + public class LazyPregenerator extends Thread implements Listener { @Getter private static LazyPregenerator instance; private final LazyPregenJob job; private final File destination; private final int maxPosition; - private final World world; + private World world; private final long rate; private final ChronoLatch latch; private static AtomicInteger lazyGeneratedChunks; @@ -49,6 +47,10 @@ public class LazyPregenerator extends Thread implements Listener { private final AtomicInteger lazyTotalChunks; private final AtomicLong startTime; private final RollingSequence chunksPerSecond; + private final RollingSequence chunksPerMinute; + + // A map to keep track of jobs for each world + private static final Map jobs = new HashMap<>(); public LazyPregenerator(LazyPregenJob job, File destination) { this.job = job; @@ -56,13 +58,15 @@ public class LazyPregenerator extends Thread implements Listener { this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> { }).count(); this.world = Bukkit.getWorld(job.getWorld()); - this.rate = Math.round((1D / (job.chunksPerMinute / 60D)) * 1000D); - this.latch = new ChronoLatch(6000); - startTime = new AtomicLong(M.ms()); - chunksPerSecond = new RollingSequence(10); + this.rate = Math.round((1D / (job.getChunksPerMinute() / 60D)) * 1000D); + this.latch = new ChronoLatch(15000); + this.startTime = new AtomicLong(M.ms()); + this.chunksPerSecond = new RollingSequence(10); + this.chunksPerMinute = new RollingSequence(10); lazyGeneratedChunks = new AtomicInteger(0); - generatedLast = new AtomicInteger(0); - lazyTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2))); + this.generatedLast = new AtomicInteger(0); + this.lazyTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2))); + jobs.put(job.getWorld(), job); LazyPregenerator.instance = this; } @@ -73,7 +77,6 @@ public class LazyPregenerator extends Thread implements Listener { public static void loadLazyGenerators() { for (World i : Bukkit.getWorlds()) { File lazygen = new File(i.getWorldFolder(), "lazygen.json"); - if (lazygen.exists()) { try { LazyPregenerator p = new LazyPregenerator(lazygen); @@ -107,15 +110,17 @@ public class LazyPregenerator extends Thread implements Listener { } public void tick() { + LazyPregenJob job = jobs.get(world.getName()); if (latch.flip() && !job.paused) { long eta = computeETA(); save(); int secondGenerated = lazyGeneratedChunks.get() - generatedLast.get(); generatedLast.set(lazyGeneratedChunks.get()); - secondGenerated = secondGenerated / 6; + secondGenerated = secondGenerated / 15; chunksPerSecond.put(secondGenerated); + chunksPerMinute.put(secondGenerated * 60); if (!job.isSilent()) { - Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); + Iris.info("LazyGen: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(lazyGeneratedChunks.get()) + " of " + Form.f(lazyTotalChunks.get()) + " " + Form.f((int) chunksPerMinute.getAverage()) + "/m ETA: " + Form.duration((double) eta, 2)); } } @@ -138,12 +143,8 @@ public class LazyPregenerator extends Thread implements Listener { } private long computeETA() { - return (long) (lazyTotalChunks.get() > 1024 ? // Generated chunks exceed 1/8th of total? - // If yes, use smooth function (which gets more accurate over time since its less sensitive to outliers) - ((lazyTotalChunks.get() - lazyGeneratedChunks.get()) * ((double) (M.ms() - startTime.get()) / (double) lazyGeneratedChunks.get())) : - // If no, use quick function (which is less accurate over time but responds better to the initial delay) - ((lazyTotalChunks.get() - lazyGeneratedChunks.get()) / chunksPerSecond.getAverage()) * 1000 // - ); + return (long) ((lazyTotalChunks.get() - lazyGeneratedChunks.get()) / chunksPerMinute.getAverage()) * 1000; + // todo broken } private final ExecutorService executorService = Executors.newSingleThreadExecutor(); @@ -154,7 +155,10 @@ public class LazyPregenerator extends Thread implements Listener { if (PaperLib.isPaper()) { PaperLib.getChunkAtAsync(world, chunk.getX(), chunk.getZ(), true) .thenAccept((i) -> { - Iris.verbose("Generated Async " + chunk); + LazyPregenJob j = jobs.get(world.getName()); + if (!j.paused) { + Iris.verbose("Generated Async " + chunk); + } latch.countDown(); }); } else { @@ -201,24 +205,65 @@ public class LazyPregenerator extends Thread implements Listener { } }); } - public void setPausedLazy(){ - if (!job.paused) { - save(); - Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world + C.BLUE + " Paused"); - job.setPaused(true); + + public static void setPausedLazy(World world) { + // todo: doesnt actually pause + LazyPregenJob job = jobs.get(world.getName()); + if (isPausedLazy(world)){ + job.paused = false; } else { - Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world + C.BLUE + " Resumes"); - job.setPaused(false); + job.paused = true; + } + + if ( job.paused) { + Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Paused"); + } else { + Iris.info(C.BLUE + "LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Resumed"); } } - public boolean isPausedLazy(){ - return job.isPaused(); + + public static boolean isPausedLazy(World world) { + LazyPregenJob job = jobs.get(world.getName()); + return job != null && job.isPaused(); } - public void shutdownInstance() { - save(); - interrupt(); + + public void shutdownInstance(World world) throws IOException { + Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " Shutting down.."); + LazyPregenJob job = jobs.get(world.getName()); + File worldDirectory = new File(Bukkit.getWorldContainer(), world.getName()); + File lazyFile = new File(worldDirectory, "lazygen.json"); + + if (job == null) { + Iris.error("No Lazygen job found for world: " + world.getName()); + return; + } + + try { + if (!job.isPaused()) { + job.setPaused(true); + } + save(); + jobs.remove(world.getName()); + new BukkitRunnable() { + @Override + public void run() { + while (lazyFile.exists()){ + lazyFile.delete(); + J.sleep(1000); + } + Iris.info("LazyGen: " + C.IRIS + world.getName() + C.BLUE + " File deleted and instance closed."); + } + }.runTaskLater(Iris.instance, 20L); + } catch (Exception e) { + Iris.error("Failed to shutdown Lazygen for " + world.getName()); + e.printStackTrace(); + } finally { + saveNow(); + interrupt(); + } } + public void saveNow() throws IOException { IO.writeAll(this.destination, new Gson().toJson(job)); } @@ -232,7 +277,7 @@ public class LazyPregenerator extends Thread implements Listener { @Builder.Default private boolean healing = false; @Builder.Default - private int chunksPerMinute = 32; // 48 hours is roughly 5000 radius + private int chunksPerMinute = 32; @Builder.Default private int radiusBlocks = 5000; @Builder.Default @@ -243,3 +288,4 @@ public class LazyPregenerator extends Thread implements Listener { boolean paused = false; } } + diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index 7018da500..e4b0b7c20 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -30,7 +30,7 @@ public class HotDropWorldSVC implements IrisService { @Override public void onEnable() { this.plugin = Iris.instance; - initializeWatchService(); + // initializeWatchService(); } @Override diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 700c67bd4..6811ed8fd 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -1,68 +1,120 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; -import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.mantle.TectonicPlate; -import com.volmit.iris.util.math.M; import com.volmit.iris.util.misc.getHardware; -import com.volmit.iris.util.parallel.BurstExecutor; -import com.volmit.iris.util.parallel.HyperLock; -import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.IrisService; +import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; -import io.papermc.lib.PaperLib; -import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.plugin.java.JavaPlugin; -import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; public class IrisEngineSVC implements IrisService { private JavaPlugin plugin; - public Looper ticker; + public Looper ticker1; + public Looper ticker2; + public Looper engineTicker; + public World selectedWorld; public List IrisWorlds = new ArrayList<>(); public List corruptedIrisWorlds = new ArrayList<>(); - @Override public void onEnable() { this.plugin = Iris.instance; - this.IrisStartup(); + tectonicLimit.set(2); + long t = getHardware.getProcessMemory(); + for (; t > 250; ) { + tectonicLimit.getAndAdd(1); + t = t - 250; + } + tectonicLimit.set(10); // DEBUG CODE this.IrisEngine(); - ticker.start(); + engineTicker.start(); + ticker1.start(); + ticker2.start(); + } + + private final AtomicReference selectedWorldRef = new AtomicReference<>(); + + public CompletableFuture initializeAsync() { + return CompletableFuture.supplyAsync(() -> { + World selectedWorld = null; + while (selectedWorld == null) { + synchronized (this) { + IrisWorlds.clear(); + for (World w : Bukkit.getServer().getWorlds()) { + if (IrisToolbelt.access(w) != null) { + IrisWorlds.add(w); + } + } + if (!IrisWorlds.isEmpty()) { + Random rand = new Random(); + int randomIndex = rand.nextInt(IrisWorlds.size()); + selectedWorld = IrisWorlds.get(randomIndex); + } + } + if (selectedWorld == null) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return null; + } + } + } + return selectedWorld; + }); } public void IrisEngine(){ - ticker = new Looper() { + engineTicker = new Looper() { @Override protected long loop() { try { - for (World world : IrisWorlds) { - Engine engine = IrisToolbelt.access(world).getEngine(); - } - PlatformChunkGenerator generator = IrisToolbelt.access(Bukkit.getWorld("localmemtest")); - if (generator != null && generator.getEngine() != null) { - Engine engine = generator.getEngine(); - engine.getMantle().trim(); + World world = selectedWorldRef.get(); + PlatformChunkGenerator generator = IrisToolbelt.access(world); + if(generator == null) { + initializeAsync().thenAcceptAsync(foundWorld -> selectedWorldRef.set(foundWorld)); } else { - Iris.info("localmemtest is nullmem"); + selectedWorld = world; + } + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; + } + + return 1000; + } + + }; + ticker1 = new Looper() { + @Override + protected long loop() { + try { + World world = selectedWorld; + PlatformChunkGenerator generator = IrisToolbelt.access(world); + if(generator != null) { + Engine engine = IrisToolbelt.access(world).getEngine(); + if (generator != null && generator.getEngine() != null) { + engine.getMantle().trim(); + } else { + Iris.info("something is null 1"); + } + } } catch (Throwable e) { Iris.reportError(e); @@ -73,38 +125,36 @@ public class IrisEngineSVC implements IrisService { return 1000; } }; - } - public void IrisStartup(){ - tectonicLimit.set(2); - long t = getHardware.getProcessMemory(); - for (; t > 250; ) { - tectonicLimit.getAndAdd(1); - t = t - 250; - } - tectonicLimit.set(10); // DEBUG CODE - - for (World w : Bukkit.getServer().getWorlds()) { - File container = Bukkit.getWorldContainer(); - Bukkit.getWorldContainer(); - if(IrisToolbelt.access(w) != null){ - IrisWorlds.add(w); - } else { - File worldDirectory = new File(container, w.getName()); - File IrisWorldTest = new File(worldDirectory, "Iris"); - if (IrisWorldTest.exists()){ - if(IrisToolbelt.access(w) == null){ - corruptedIrisWorlds.add(w); + ticker2 = new Looper() { + @Override + protected long loop() { + try { + World world = selectedWorld; + PlatformChunkGenerator generator = IrisToolbelt.access(world); + if(generator != null) { + Engine engine = IrisToolbelt.access(world).getEngine(); + if (generator != null && generator.getEngine() != null) { + engine.getMantle().unloadTectonicPlate(); + } else { + Iris.info("something is null 2"); + } } + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; } + return 1000; } - } + }; } @Override public void onDisable() { - ticker.interrupt(); - + ticker1.interrupt(); + ticker2.interrupt(); + engineTicker.interrupt(); } } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 1a22f797c..c6d234c2e 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -178,6 +178,9 @@ public interface EngineMantle extends IObjectPlacer { default void trim() { getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive())); } + default void unloadTectonicPlate(){ + getMantle().unloadTectonicPlate(); + } default MultiBurst burst() { return getEngine().burst(); 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 ed4267554..b67d52812 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 @@ -91,12 +91,6 @@ public class Mantle { loadedRegions = new KMap<>(); lastUse = new KMap<>(); ioBurst = MultiBurst.burst; - if (!ioTectonicUnload.get()) { - this.unloadTectonicPlate(); - if (!ticker.isAlive()) { - ticker.start(); - } - } Iris.debug("Opened The Mantle " + C.DARK_AQUA + dataFolder.getAbsolutePath()); } @@ -421,7 +415,7 @@ public class Mantle { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } - Iris.info(C.BLUE + "TECTONIC TRIM HAS RUN"); + Iris.debug(C.BLUE + "TECTONIC TRIM HAS RUN"); if (IrisSettings.get().getPerformance().getAggressiveTectonicThreshold() == -1) { forceAggressiveThreshold.set(tectonicLimit.get()); } else { @@ -493,12 +487,10 @@ public class Mantle { } } - protected void unloadTectonicPlate() { - ticker = new Looper() { - protected long loop() { + public synchronized void unloadTectonicPlate() { long time = System.currentTimeMillis(); try { - Iris.info(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); + Iris.debug(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); int threadCount = 1; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); List toUnloadList; @@ -537,11 +529,8 @@ public class Mantle { executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (Exception e) { e.printStackTrace(); - return -1; } - return Math.max(0, 1000-(System.currentTimeMillis()-time)); - } - }; + ioTectonicUnload.set(true); } From 1809d4a53fc6b37badebf54448df56a7f6bb0d5d Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 15 Dec 2023 20:14:34 +0100 Subject: [PATCH 35/66] - Added JDK version check for an SFG - Fixed duplicate cpu message on boot when on intel and unstable --- core/src/main/java/com/volmit/iris/Iris.java | 24 ++++++++++--------- .../iris/core/safeguard/ServerBootSFG.java | 9 +++++++ .../volmit/iris/core/safeguard/UtilsSFG.java | 9 ++++++- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 9aa60164e..274eb598e 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -350,7 +350,7 @@ public class Iris extends VolmitPlugin implements Listener { } } - private static int getJavaVersion() { + public static int getJavaVersion() { String version = System.getProperty("java.version"); if (version.startsWith("1.")) { version = version.substring(2, 3); @@ -787,18 +787,20 @@ public class Iris extends VolmitPlugin implements Listener { } Iris.info("Server OS: " + osName + " (" + osArch + ")"); - if(unstablemode) Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel()); try { - if (getCPUModel().contains("Intel")) { - Iris.info("Server Cpu: " + C.BLUE + getCPUModel()); + if(unstablemode){ + Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel()); + } else { + if (getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.BLUE + getCPUModel()); + } + if (getCPUModel().contains("Ryzen")) { + Iris.info("Server Cpu: " + C.RED + getCPUModel()); + } + if (!getCPUModel().contains("Ryzen") && !getCPUModel().contains("Intel")) { + Iris.info("Server Cpu: " + C.GRAY + getCPUModel()); + } } - if (getCPUModel().contains("Ryzen")) { - Iris.info("Server Cpu: " + C.RED + getCPUModel()); - } - if (!getCPUModel().contains("Ryzen") && !getCPUModel().contains("Intel")) { - Iris.info("Server Cpu: " + C.GRAY + getCPUModel()); - } - } catch (Exception e){ Iris.info("Server Cpu: " + C.DARK_RED + "Failed"); } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 2e8f14786..02047f315 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -6,14 +6,17 @@ import com.volmit.iris.core.nms.v1X.NMSBinding1X; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; +import javax.tools.ToolProvider; import java.util.*; +import static com.volmit.iris.Iris.getJavaVersion; import static com.volmit.iris.Iris.instance; import static com.volmit.iris.core.safeguard.IrisSafeguard.stablemode; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; public class ServerBootSFG { public static final Map incompatiblePlugins = new HashMap<>(); + public static boolean isJDK17 = true; public static boolean unsuportedversion = false; protected static boolean safeguardPassed; public static boolean passedserversoftware = true; @@ -67,6 +70,12 @@ public class ServerBootSFG { severityHigh++; } + boolean jdk = System.getProperty("java.compiler") != null; + if(getJavaVersion() != 17 || !jdk) { + isJDK17 = false; + severityMedium++; + } + allIncompatiblePlugins = joiner.toString(); safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index b026f8f02..93be5617d 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -37,7 +37,14 @@ public class UtilsSFG { if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.RED + "Unsupported Server Software"); Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); - + } + if (!ServerBootSFG.isJDK17) { + Iris.safeguard(C.YELLOW + "Unsupported Server JDK"); + if (Iris.getJavaVersion() == 17) { + Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion()); + } else { + Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); + } } } } From 7ce219a6a866f1cf71d2fb813447b2e3e5814195 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Dec 2023 13:45:21 +0100 Subject: [PATCH 36/66] - Added warning mode - ignoreUnstable Changed to ignoreBootMode --- core/src/main/java/com/volmit/iris/Iris.java | 38 ++++++++-- .../com/volmit/iris/core/IrisSettings.java | 2 +- .../iris/core/commands/CommandIris.java | 17 +---- .../iris/core/safeguard/IrisSafeguard.java | 1 + .../{UnstableModeSFG.java => ModesSFG.java} | 32 +++++++-- .../iris/core/safeguard/ServerBootSFG.java | 72 ++++++++++++++----- .../volmit/iris/core/safeguard/UtilsSFG.java | 27 ++++--- 7 files changed, 136 insertions(+), 53 deletions(-) rename core/src/main/java/com/volmit/iris/core/safeguard/{UnstableModeSFG.java => ModesSFG.java} (62%) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 274eb598e..020756d42 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -95,7 +95,7 @@ import java.net.URL; import java.util.Date; import java.util.Map; -import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.IrisSafeguard.*; import static com.volmit.iris.core.safeguard.ServerBootSFG.passedserversoftware; import static com.volmit.iris.util.misc.getHardware.getCPUModel; import static com.volmit.iris.util.misc.getHardware.getCPUThreads; @@ -592,9 +592,11 @@ public class Iris extends VolmitPlugin implements Listener { if (unstablemode) { return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.RED + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; } - else { - return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.IRIS + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; + if (warningmode) { + return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.GOLD + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; } + return C.BOLD + "" + C.DARK_GRAY + "[" + C.BOLD + "" + C.IRIS + "Iris" + C.BOLD + C.DARK_GRAY + "]" + C.RESET + "" + C.GRAY + ": "; + } private boolean setupChecks() { @@ -741,6 +743,9 @@ public class Iris extends VolmitPlugin implements Listener { if (unstablemode) { info = new String[]{"", "", "", "", "", padd2 + C.RED + " Iris", padd2 + C.GRAY + " by " + C.DARK_RED + "Volmit Software", padd2 + C.GRAY + " v" + C.RED + getDescription().getVersion()}; } + if (warningmode) { + info = new String[]{"", "", "", "", "", padd2 + C.GOLD + " Iris", padd2 + C.GRAY + " by " + C.GOLD + "Volmit Software", padd2 + C.GRAY + " v" + C.GOLD + getDescription().getVersion()}; + } String[] splashstable = { padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@", @@ -769,8 +774,27 @@ public class Iris extends VolmitPlugin implements Listener { padd + C.GRAY + "" + C.RED + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@", padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@" }; - String[] splash = unstablemode ? splashunstable : splashstable; // Choose the appropriate splash array based on unstablemode - + String[] splashwarning = { + padd + C.GRAY + " @@@@@@@@@@@@@@" + C.DARK_GRAY + "@@@", + padd + C.GRAY + " @@&&&&&&&&&" + C.DARK_GRAY + "&&&&&&" + C.GOLD + " .(((()))). ", + padd + C.GRAY + "@@@&&&&&&&&" + C.DARK_GRAY + "&&&&&" + C.GOLD + " .((((((())))))). ", + padd + C.GRAY + "@@@&&&&&" + C.DARK_GRAY + "&&&&&&&" + C.GOLD + " ((((((((())))))))) " + C.GRAY + " @", + padd + C.GRAY + "@@@&&&&" + C.DARK_GRAY + "@@@@@&" + C.GOLD + " ((((((((-))))))))) " + C.GRAY + " @@", + padd + C.GRAY + "@@@&&" + C.GOLD + " ((((((({ })))))))) " + C.GRAY + " &&@@@", + padd + C.GRAY + "@@" + C.GOLD + " ((((((((-))))))))) " + C.DARK_GRAY + "&@@@@@" + C.GRAY + "&&&&@@@", + padd + C.GRAY + "@" + C.GOLD + " ((((((((())))))))) " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&@@@", + padd + C.GRAY + "" + C.GOLD + " '((((((()))))))' " + C.DARK_GRAY + "&&&&&" + C.GRAY + "&&&&&&&&@@@", + padd + C.GRAY + "" + C.GOLD + " '(((())))' " + C.DARK_GRAY + "&&&&&&&&" + C.GRAY + "&&&&&&&@@", + padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@" + }; + String[] splash; + if (unstablemode) { + splash = splashunstable; + } else if (warningmode) { + splash = splashwarning; + } else { + splash = splashstable; + } OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); String osArch = osBean.getArch(); String osName = osBean.getName(); @@ -788,6 +812,9 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Server OS: " + osName + " (" + osArch + ")"); try { + if (warningmode){ + Iris.info("Server Cpu: " + C.GOLD + getCPUModel()); + } else { if(unstablemode){ Iris.info("Server Cpu: " + C.DARK_RED + getCPUModel()); } else { @@ -801,6 +828,7 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Server Cpu: " + C.GRAY + getCPUModel()); } } + } } catch (Exception e){ Iris.info("Server Cpu: " + C.DARK_RED + "Failed"); } 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 60b691807..20e11ceca 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -148,7 +148,7 @@ public class IrisSettings { @Data public static class IrisSettingsGeneral { - public boolean bootUnstable = false; + public boolean ignoreBootMode = false; public boolean useIntegratedChunkHandler = false; public boolean commandSounds = true; public boolean debug = false; diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index 76c2af063..dda9d8d45 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -23,40 +23,29 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisBenchmarking; import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.core.safeguard.UtilsSFG; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.decree.specialhandlers.NullablePlayerHandler; import com.volmit.iris.util.format.C; -import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.parallel.BurstExecutor; -import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.jobs.QueueJob; import lombok.Getter; import org.bukkit.Bukkit; -import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import java.io.File; import java.io.IOException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import static com.volmit.iris.core.service.EditSVC.deletingWorld; import static com.volmit.iris.core.tools.IrisBenchmarking.inProgress; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatiblePlugins; +import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatibilities; @Decree(name = "iris", aliases = {"ir", "irs"}, description = "Basic Command") public class CommandIris implements DecreeExecutor { @@ -85,7 +74,7 @@ public class CommandIris implements DecreeExecutor { long seed ) { if(sender() instanceof Player) { - if (incompatiblePlugins.get("Multiverse-Core")) { + if (incompatibilities.get("Multiverse-Core")) { sender().sendMessage(C.RED + "Your server has an incompatibility that may corrupt all worlds on the server if not handled properly."); sender().sendMessage(C.RED + "it is strongly advised for you to take action. see log for full detail"); sender().sendMessage(C.RED + "----------------------------------------------------------------"); @@ -93,7 +82,7 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.RED + UtilsSFG.MSGIncompatibleWarnings()); sender().sendMessage(C.RED + "----------------------------------------------------------------"); } - if (unstablemode && !incompatiblePlugins.get("Multiverse-Core")) { + if (unstablemode && !incompatibilities.get("Multiverse-Core")) { sender().sendMessage(C.RED + "Your server is experiencing an incompatibility with the Iris plugin."); sender().sendMessage(C.RED + "Please rectify this problem to avoid further complications."); sender().sendMessage(C.RED + "----------------------------------------------------------------"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 2c06eef8e..d2d9f7a61 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -4,6 +4,7 @@ import com.volmit.iris.Iris; public class IrisSafeguard { public static boolean unstablemode = false; + public static boolean warningmode = false; public static boolean stablemode = false; public static void IrisSafeguardSystem() { Iris.info("Enabled Iris SafeGuard"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java similarity index 62% rename from core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java rename to core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java index 3d3f5c190..299690fb2 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UnstableModeSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java @@ -4,12 +4,17 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; -public class UnstableModeSFG { +public class ModesSFG { public static void selectMode(){ if (IrisSafeguard.unstablemode) { Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); unstable(); - } else { + } + if (IrisSafeguard.warningmode) { + Iris.safeguard(C.GOLD + "Iris is running in Warning Mode"); + warning(); + } + if (IrisSafeguard.stablemode) { stable(); } } @@ -38,10 +43,10 @@ public class UnstableModeSFG { Iris.info(C.DARK_RED + "ATTENTION: " + C.RED + "While running Iris in unstable mode, you won't be eligible for support."); Iris.info(C.DARK_RED + "CAUSE: " + C.RED + UtilsSFG.MSGIncompatibleWarnings()); - if (IrisSettings.get().getGeneral().bootUnstable) { + if (IrisSettings.get().getGeneral().ignoreBootMode) { Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); } else { - Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreUnstable to true if you wish to proceed."); + Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreBootMode to true if you wish to proceed."); while (true) { try { Thread.sleep(1000); @@ -53,4 +58,23 @@ public class UnstableModeSFG { Iris.info(""); } } + + public static void warning() { + + UtilsSFG.printIncompatibleWarnings(); + + if (IrisSafeguard.warningmode) { + Iris.info(""); + Iris.info(C.DARK_GRAY + "--==<" + C.GOLD + " IMPORTANT " + C.DARK_GRAY + ">==--"); + Iris.info(C.GOLD + "Iris is running in warning mode which may cause the following issues:"); + Iris.info(C.YELLOW + "- Data Loss"); + Iris.info(C.YELLOW + "- Errors"); + Iris.info(C.YELLOW + "- Broken worlds"); + Iris.info(C.YELLOW + "- Unexpected behavior."); + Iris.info(C.YELLOW + "- And perhaps further complications."); + Iris.info(C.GOLD + "ATTENTION: " + C.YELLOW + "While running Iris in unstable mode, you won't be eligible for support."); + Iris.info(C.GOLD + "CAUSE: " + C.YELLOW + UtilsSFG.MSGIncompatibleWarnings()); + Iris.info(""); + } + } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 02047f315..642fb103a 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -6,17 +6,17 @@ import com.volmit.iris.core.nms.v1X.NMSBinding1X; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import javax.tools.ToolProvider; +import java.io.File; import java.util.*; import static com.volmit.iris.Iris.getJavaVersion; import static com.volmit.iris.Iris.instance; -import static com.volmit.iris.core.safeguard.IrisSafeguard.stablemode; -import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.IrisSafeguard.*; public class ServerBootSFG { - public static final Map incompatiblePlugins = new HashMap<>(); + public static final Map incompatibilities = new HashMap<>(); public static boolean isJDK17 = true; + public static boolean isJRE = false; public static boolean unsuportedversion = false; protected static boolean safeguardPassed; public static boolean passedserversoftware = true; @@ -24,31 +24,31 @@ public class ServerBootSFG { protected static byte severityLow; protected static byte severityMedium; protected static byte severityHigh; - public static String allIncompatiblePlugins; + public static String allIncompatibilities; public static void BootCheck() { Iris.info("Checking for possible conflicts.."); org.bukkit.plugin.PluginManager pluginManager = Bukkit.getPluginManager(); Plugin[] plugins = pluginManager.getPlugins(); - incompatiblePlugins.clear(); - incompatiblePlugins.put("Multiverse-Core", false); - incompatiblePlugins.put("Dynmap", false); - incompatiblePlugins.put("TerraformGenerator", false); - incompatiblePlugins.put("Stratos", false); + incompatibilities.clear(); + incompatibilities.put("Multiverse-Core", false); + incompatibilities.put("Dynmap", false); + incompatibilities.put("TerraformGenerator", false); + incompatibilities.put("Stratos", false); String pluginName; for (Plugin plugin : plugins) { pluginName = plugin.getName(); - Boolean flag = incompatiblePlugins.get(pluginName); + Boolean flag = incompatibilities.get(pluginName); if (flag != null && !flag) { severityHigh++; - incompatiblePlugins.put(pluginName, true); + incompatibilities.put(pluginName, true); } } StringJoiner joiner = new StringJoiner(", "); - for (Map.Entry entry : incompatiblePlugins.entrySet()) { + for (Map.Entry entry : incompatibilities.entrySet()) { if (entry.getValue()) { joiner.add(entry.getKey()); } @@ -64,19 +64,25 @@ public class ServerBootSFG { joiner.add("Server Software"); severityHigh++; } + if (INMS.get() instanceof NMSBinding1X) { unsuportedversion = true; joiner.add("Unsupported Minecraft Version"); severityHigh++; } - boolean jdk = System.getProperty("java.compiler") != null; - if(getJavaVersion() != 17 || !jdk) { + if(getJavaVersion() != 17) { isJDK17 = false; + joiner.add("Unsupported Java version"); + severityMedium++; + } + if(!isJDK()) { + isJRE = true; + joiner.add("Unsupported JDK"); severityMedium++; } - allIncompatiblePlugins = joiner.toString(); + allIncompatibilities = joiner.toString(); safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); count = severityHigh + severityMedium + severityLow; @@ -85,8 +91,38 @@ public class ServerBootSFG { Iris.safeguard("Stable mode has been activated."); } if(!safeguardPassed){ - unstablemode = true; - Iris.safeguard("Unstable mode has been activated."); + if (severityMedium >= 1 && severityHigh == 0) { + warningmode = true; + Iris.safeguard("Warning mode has been activated."); + } + if (severityHigh >= 1) { + unstablemode = true; + Iris.safeguard("Unstable mode has been activated."); + } } } + + public static boolean isJDK() { + String path = System.getProperty("sun.boot.library.path"); + if(path != null) { + String javacPath = ""; + if(path.endsWith(File.separator + "bin")) { + javacPath = path; + } else { + int libIndex = path.lastIndexOf(File.separator + "lib"); + if (libIndex > 0) { + javacPath = path.substring(0, libIndex) + File.separator + "bin"; + } + } + if (checkJavac(javacPath)) + return true; + } + path = System.getProperty("java.home"); + return path != null && checkJavac(path + File.separator + "bin"); + } + + private static boolean checkJavac(String path) { + return !path.isEmpty() && (new File(path, "javac").exists() || new File(path, "javac.exe").exists()); + } + } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index 93be5617d..8b94006c8 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -5,7 +5,7 @@ import com.volmit.iris.util.format.C; public class UtilsSFG { public static void splash(){ - UnstableModeSFG.selectMode(); + ModesSFG.selectMode(); } public static void printIncompatibleWarnings(){ @@ -14,19 +14,24 @@ public class UtilsSFG { if (ServerBootSFG.safeguardPassed) { Iris.safeguard(C.BLUE + "0 Conflicts found"); } else { - Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); + if (IrisSafeguard.unstablemode) { + Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); + } + if (IrisSafeguard.warningmode) { + Iris.safeguard(C.YELLOW + "" + ServerBootSFG.count + " Conflicts found"); + } - if (ServerBootSFG.incompatiblePlugins.get("Multiverse-Core")) { + if (ServerBootSFG.incompatibilities.get("Multiverse-Core")) { Iris.safeguard(C.RED + "Multiverse"); Iris.safeguard(C.RED + "- The plugin Multiverse is not compatible with the server."); Iris.safeguard(C.RED + "- If you want to have a world manager, consider using PhantomWorlds or MyWorlds instead."); } - if (ServerBootSFG.incompatiblePlugins.get("Dynmap")) { + if (ServerBootSFG.incompatibilities.get("Dynmap")) { Iris.safeguard(C.RED + "Dynmap"); Iris.safeguard(C.RED + "- The plugin Dynmap is not compatible with the server."); Iris.safeguard(C.RED + "- If you want to have a map plugin like Dynmap, consider Bluemap."); } - if (ServerBootSFG.incompatiblePlugins.get("TerraformGenerator") || ServerBootSFG.incompatiblePlugins.get("Stratos")) { + if (ServerBootSFG.incompatibilities.get("TerraformGenerator") || ServerBootSFG.incompatibilities.get("Stratos")) { Iris.safeguard(C.YELLOW + "Terraform Generator / Stratos"); Iris.safeguard(C.YELLOW + "- Iris is not compatible with other worldgen plugins."); } @@ -39,17 +44,17 @@ public class UtilsSFG { Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); } if (!ServerBootSFG.isJDK17) { - Iris.safeguard(C.YELLOW + "Unsupported Server JDK"); - if (Iris.getJavaVersion() == 17) { - Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion()); - } else { + Iris.safeguard(C.YELLOW + "Unsupported java version"); Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); - } + } + if (!ServerBootSFG.isJRE) { + Iris.safeguard(C.YELLOW + "Unsupported Server JDK"); + Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion()); } } } public static String MSGIncompatibleWarnings() { - return ServerBootSFG.allIncompatiblePlugins; + return ServerBootSFG.allIncompatibilities; } } From 008e758da80b7c8a7c524d9e3f1f80cbaa8e924b Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Dec 2023 13:51:31 +0100 Subject: [PATCH 37/66] To many issues that are just not worth dealing with --- .../iris/core/service/HotDropWorldSVC.java | 166 ------------------ 1 file changed, 166 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java deleted file mode 100644 index e4b0b7c20..000000000 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.volmit.iris.core.service; - -import java.nio.file.*; - -import static com.volmit.iris.core.commands.CommandIris.worldCreation; -import static java.nio.file.StandardWatchEventKinds.*; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonParseException; -import com.volmit.iris.Iris; -import com.volmit.iris.util.SFG.WorldHandlerSFG; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.plugin.IrisService; -import com.volmit.iris.util.scheduling.Looper; -import org.bukkit.Bukkit; -import org.bukkit.plugin.java.JavaPlugin; - -public class HotDropWorldSVC implements IrisService { - private WatchService watchService; - private JavaPlugin plugin; - public Looper ticker; - - @Override - public void onEnable() { - this.plugin = Iris.instance; - // initializeWatchService(); - } - - @Override - public void onDisable() { - ticker.interrupt(); - } - - private void initializeWatchService() { - try { - this.watchService = FileSystems.getDefault().newWatchService(); - Path path = Paths.get(Bukkit.getWorldContainer().getAbsolutePath()); - path.register(watchService, ENTRY_CREATE); - this.startLoop(); - ticker.start(); - } catch (Exception e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - public void startLoop() { - final JavaPlugin finalPlugin = this.plugin; - ticker = new Looper() { - @Override - protected long loop() { - WatchKey key; - try { - if (worldCreation){ - return -1; - } - key = watchService.poll(); - if (key != null) { - for (WatchEvent event : key.pollEvents()) { - WatchEvent.Kind kind = event.kind(); - - if (kind == ENTRY_CREATE) { - WatchEvent ev = (WatchEvent) event; - Path filename = ev.context(); - - File newDir = new File(Bukkit.getWorldContainer(), filename.toString()); - File irisFolder = new File(newDir, "iris"); - if (irisFolder.exists() && irisFolder.isDirectory()) { - Iris.info("World HotDrop Detected!"); - String worldName = newDir.getName(); - String version = getVersionFromIrisFolder(irisFolder); - - if (Bukkit.getWorld(worldName) == null && isPackValid(worldName, version)) { - Bukkit.getScheduler().runTask(finalPlugin, () -> WorldHandlerSFG.LoadWorld(worldName)); - } - } - } - } - key.reset(); - } - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - return -1; - } - - return 1000; - } - }; - } - - private String getVersionFromIrisFolder(File irisFolder) { - File versionFile = new File(irisFolder, "some_version_file.json"); - - if (versionFile.exists() && versionFile.isFile()) { - try (FileReader reader = new FileReader(versionFile)) { - JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject(); - if (jsonObject.has("version")) { - return jsonObject.get("version").getAsString(); - } - } catch (IOException | JsonParseException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - return "???"; - } - - private boolean isPackValid(String worldPackName, String version) { - try { - File packFolder = Iris.service(StudioSVC.class).getWorkspaceFolder(); - File[] serverPacks = packFolder.listFiles(File::isDirectory); - if (serverPacks != null) { - for (File serverPack : serverPacks) { - String serverPackName = serverPack.getName(); - String serverPackVersion = getPackVersion(serverPack); - - if (serverPackName.equals(worldPackName)) { - if (serverPackVersion.equals(version)) { - return true; - } else { - Iris.info("Version mismatch for pack '" + worldPackName + "'. Expected: " + serverPackVersion + ", Found: " + version); - Iris.info(C.GOLD + "Cant load the world!"); - return false; - } - } - } - Iris.info("Pack '" + worldPackName + "' not found on the server."); - Iris.info(C.GOLD + "Cant load the world!"); - } else { - Iris.info("No packs found in the server's workspace folder."); - } - } catch (Exception e) { - Iris.reportError(e); - e.printStackTrace(); - Iris.info("Error checking if pack is valid: " + e.getMessage()); - } - return false; - } - - private String getPackVersion(File pack) { - String version = "???"; - File dimensionFile = new File(pack, "dimensions/" + pack.getName() + ".json"); - if (dimensionFile.isFile()) { - try (FileReader reader = new FileReader(dimensionFile)) { - JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); - if (json.has("version")) { - version = json.get("version").getAsString(); - } - } catch (IOException | JsonParseException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - return version; - } -} - From 07e0b52ea3cce565621fcf933c2adc830229221b Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Dec 2023 14:08:10 +0100 Subject: [PATCH 38/66] e --- .../main/java/com/volmit/iris/core/service/IrisEngineSVC.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 6811ed8fd..168efe125 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -31,6 +31,8 @@ public class IrisEngineSVC implements IrisService { public List IrisWorlds = new ArrayList<>(); public List corruptedIrisWorlds = new ArrayList<>(); + // todo make this work with multiple worlds + @Override public void onEnable() { this.plugin = Iris.instance; @@ -91,6 +93,7 @@ public class IrisEngineSVC implements IrisService { } else { selectedWorld = world; } + selectedWorld = Bukkit.getWorld("localmemtest"); // debug code } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); From 28523a95939afb61873bdcfb4cc126f9bb90c7ae Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Dec 2023 14:29:56 +0100 Subject: [PATCH 39/66] e --- .../iris/core/service/IrisEngineSVC.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 168efe125..3743b777c 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -81,14 +81,14 @@ public class IrisEngineSVC implements IrisService { }); } - public void IrisEngine(){ + public void IrisEngine() { engineTicker = new Looper() { @Override protected long loop() { try { World world = selectedWorldRef.get(); PlatformChunkGenerator generator = IrisToolbelt.access(world); - if(generator == null) { + if (generator == null) { initializeAsync().thenAcceptAsync(foundWorld -> selectedWorldRef.set(foundWorld)); } else { selectedWorld = world; @@ -110,13 +110,13 @@ public class IrisEngineSVC implements IrisService { try { World world = selectedWorld; PlatformChunkGenerator generator = IrisToolbelt.access(world); - if(generator != null) { - Engine engine = IrisToolbelt.access(world).getEngine(); - if (generator != null && generator.getEngine() != null) { - engine.getMantle().trim(); - } else { - Iris.info("something is null 1"); - } + if (generator != null) { + Engine engine = IrisToolbelt.access(world).getEngine(); + if (generator != null && generator.getEngine() != null) { + engine.getMantle().trim(); + } else { + Iris.info("something is null 1"); + } } } catch (Throwable e) { @@ -135,7 +135,7 @@ public class IrisEngineSVC implements IrisService { try { World world = selectedWorld; PlatformChunkGenerator generator = IrisToolbelt.access(world); - if(generator != null) { + if (generator != null) { Engine engine = IrisToolbelt.access(world).getEngine(); if (generator != null && generator.getEngine() != null) { engine.getMantle().unloadTectonicPlate(); From c0fdf23133dcbb36c487847a5cdc82f86204f623 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Dec 2023 14:32:06 +0100 Subject: [PATCH 40/66] cleanup --- .../iris/core/safeguard/IrisSafeguard.java | 1 + .../volmit/iris/core/safeguard/ModesSFG.java | 137 +++++++++--------- .../iris/core/safeguard/PerformanceSFG.java | 8 +- .../iris/core/safeguard/ServerBootSFG.java | 27 ++-- .../volmit/iris/core/safeguard/UtilsSFG.java | 98 ++++++------- 5 files changed, 134 insertions(+), 137 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index d2d9f7a61..4fb25371a 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -6,6 +6,7 @@ public class IrisSafeguard { public static boolean unstablemode = false; public static boolean warningmode = false; public static boolean stablemode = false; + public static void IrisSafeguardSystem() { Iris.info("Enabled Iris SafeGuard"); ServerBootSFG.BootCheck(); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java index 299690fb2..3bd04d0db 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java @@ -5,76 +5,77 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; public class ModesSFG { - public static void selectMode(){ - if (IrisSafeguard.unstablemode) { - Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); - unstable(); - } - if (IrisSafeguard.warningmode) { - Iris.safeguard(C.GOLD + "Iris is running in Warning Mode"); - warning(); - } - if (IrisSafeguard.stablemode) { - stable(); - } - } - public static void stable(){ - Iris.safeguard(C.BLUE + "Iris is running Stable"); - } - - public static void unstable() { - - UtilsSFG.printIncompatibleWarnings(); - - if (IrisSafeguard.unstablemode) { - Iris.info(""); - Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); - Iris.info(C.RED + "Iris is running in unstable mode which may cause the following issues:"); - Iris.info(C.DARK_RED + "Server Issues"); - Iris.info(C.RED + "- Server won't boot"); - Iris.info(C.RED + "- Data Loss"); - Iris.info(C.RED + "- Unexpected behavior."); - Iris.info(C.RED + "- And More..."); - Iris.info(C.DARK_RED + "World Issues"); - Iris.info(C.RED + "- Worlds can't load due to corruption."); - Iris.info(C.RED + "- Worlds may slowly corrupt until they can't load."); - Iris.info(C.RED + "- World data loss."); - Iris.info(C.RED + "- And More..."); - Iris.info(C.DARK_RED + "ATTENTION: " + C.RED + "While running Iris in unstable mode, you won't be eligible for support."); - Iris.info(C.DARK_RED + "CAUSE: " + C.RED + UtilsSFG.MSGIncompatibleWarnings()); - - if (IrisSettings.get().getGeneral().ignoreBootMode) { - Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); - } else { - Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreBootMode to true if you wish to proceed."); - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // Handle interruption - } + public static void selectMode() { + if (IrisSafeguard.unstablemode) { + Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); + unstable(); + } + if (IrisSafeguard.warningmode) { + Iris.safeguard(C.GOLD + "Iris is running in Warning Mode"); + warning(); + } + if (IrisSafeguard.stablemode) { + stable(); + } } - } - Iris.info(""); - } - } - public static void warning() { + public static void stable() { + Iris.safeguard(C.BLUE + "Iris is running Stable"); + } - UtilsSFG.printIncompatibleWarnings(); + public static void unstable() { - if (IrisSafeguard.warningmode) { - Iris.info(""); - Iris.info(C.DARK_GRAY + "--==<" + C.GOLD + " IMPORTANT " + C.DARK_GRAY + ">==--"); - Iris.info(C.GOLD + "Iris is running in warning mode which may cause the following issues:"); - Iris.info(C.YELLOW + "- Data Loss"); - Iris.info(C.YELLOW + "- Errors"); - Iris.info(C.YELLOW + "- Broken worlds"); - Iris.info(C.YELLOW + "- Unexpected behavior."); - Iris.info(C.YELLOW + "- And perhaps further complications."); - Iris.info(C.GOLD + "ATTENTION: " + C.YELLOW + "While running Iris in unstable mode, you won't be eligible for support."); - Iris.info(C.GOLD + "CAUSE: " + C.YELLOW + UtilsSFG.MSGIncompatibleWarnings()); - Iris.info(""); - } - } + UtilsSFG.printIncompatibleWarnings(); + + if (IrisSafeguard.unstablemode) { + Iris.info(""); + Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); + Iris.info(C.RED + "Iris is running in unstable mode which may cause the following issues:"); + Iris.info(C.DARK_RED + "Server Issues"); + Iris.info(C.RED + "- Server won't boot"); + Iris.info(C.RED + "- Data Loss"); + Iris.info(C.RED + "- Unexpected behavior."); + Iris.info(C.RED + "- And More..."); + Iris.info(C.DARK_RED + "World Issues"); + Iris.info(C.RED + "- Worlds can't load due to corruption."); + Iris.info(C.RED + "- Worlds may slowly corrupt until they can't load."); + Iris.info(C.RED + "- World data loss."); + Iris.info(C.RED + "- And More..."); + Iris.info(C.DARK_RED + "ATTENTION: " + C.RED + "While running Iris in unstable mode, you won't be eligible for support."); + Iris.info(C.DARK_RED + "CAUSE: " + C.RED + UtilsSFG.MSGIncompatibleWarnings()); + + if (IrisSettings.get().getGeneral().ignoreBootMode) { + Iris.info(C.DARK_RED + "Boot Unstable is set to true, continuing with the startup process."); + } else { + Iris.info(C.DARK_RED + "Go to plugins/iris/settings.json and set ignoreBootMode to true if you wish to proceed."); + while (true) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // Handle interruption + } + } + } + Iris.info(""); + } + } + + public static void warning() { + + UtilsSFG.printIncompatibleWarnings(); + + if (IrisSafeguard.warningmode) { + Iris.info(""); + Iris.info(C.DARK_GRAY + "--==<" + C.GOLD + " IMPORTANT " + C.DARK_GRAY + ">==--"); + Iris.info(C.GOLD + "Iris is running in warning mode which may cause the following issues:"); + Iris.info(C.YELLOW + "- Data Loss"); + Iris.info(C.YELLOW + "- Errors"); + Iris.info(C.YELLOW + "- Broken worlds"); + Iris.info(C.YELLOW + "- Unexpected behavior."); + Iris.info(C.YELLOW + "- And perhaps further complications."); + Iris.info(C.GOLD + "ATTENTION: " + C.YELLOW + "While running Iris in unstable mode, you won't be eligible for support."); + Iris.info(C.GOLD + "CAUSE: " + C.YELLOW + UtilsSFG.MSGIncompatibleWarnings()); + Iris.info(""); + } + } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java index aef67226e..90aab8cf5 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java @@ -1,13 +1,7 @@ package com.volmit.iris.core.safeguard; -import com.volmit.iris.core.IrisSettings; -import oshi.SystemInfo; -import oshi.hardware.GlobalMemory; - -import static com.volmit.iris.util.misc.getHardware.*; - public class PerformanceSFG { - public static void calculatePerformance(){ + public static void calculatePerformance() { } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 642fb103a..4cf20c30f 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -7,7 +7,9 @@ import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import java.io.File; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.StringJoiner; import static com.volmit.iris.Iris.getJavaVersion; import static com.volmit.iris.Iris.instance; @@ -54,12 +56,11 @@ public class ServerBootSFG { } } if ( - !instance.getServer().getVersion().contains("Purpur") && - !instance.getServer().getVersion().contains("Paper") && - !instance.getServer().getVersion().contains("Spigot") && - !instance.getServer().getVersion().contains("Pufferfish") && - !instance.getServer().getVersion().contains("Bukkit")) - { + !instance.getServer().getVersion().contains("Purpur") && + !instance.getServer().getVersion().contains("Paper") && + !instance.getServer().getVersion().contains("Spigot") && + !instance.getServer().getVersion().contains("Pufferfish") && + !instance.getServer().getVersion().contains("Bukkit")) { passedserversoftware = false; joiner.add("Server Software"); severityHigh++; @@ -71,12 +72,12 @@ public class ServerBootSFG { severityHigh++; } - if(getJavaVersion() != 17) { + if (getJavaVersion() != 17) { isJDK17 = false; joiner.add("Unsupported Java version"); severityMedium++; } - if(!isJDK()) { + if (!isJDK()) { isJRE = true; joiner.add("Unsupported JDK"); severityMedium++; @@ -86,11 +87,11 @@ public class ServerBootSFG { safeguardPassed = (severityHigh == 0 && severityMedium == 0 && severityLow == 0); count = severityHigh + severityMedium + severityLow; - if(safeguardPassed){ + if (safeguardPassed) { stablemode = true; Iris.safeguard("Stable mode has been activated."); } - if(!safeguardPassed){ + if (!safeguardPassed) { if (severityMedium >= 1 && severityHigh == 0) { warningmode = true; Iris.safeguard("Warning mode has been activated."); @@ -104,9 +105,9 @@ public class ServerBootSFG { public static boolean isJDK() { String path = System.getProperty("sun.boot.library.path"); - if(path != null) { + if (path != null) { String javacPath = ""; - if(path.endsWith(File.separator + "bin")) { + if (path.endsWith(File.separator + "bin")) { javacPath = path; } else { int libIndex = path.lastIndexOf(File.separator + "lib"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index 8b94006c8..b0cd659d6 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -4,57 +4,57 @@ import com.volmit.iris.Iris; import com.volmit.iris.util.format.C; public class UtilsSFG { - public static void splash(){ - ModesSFG.selectMode(); - } + public static void splash() { + ModesSFG.selectMode(); + } - public static void printIncompatibleWarnings(){ - // String SupportedIrisVersion = getDescription().getVersion(); //todo Automatic version + public static void printIncompatibleWarnings() { + // String SupportedIrisVersion = getDescription().getVersion(); //todo Automatic version - if (ServerBootSFG.safeguardPassed) { - Iris.safeguard(C.BLUE + "0 Conflicts found"); - } else { - if (IrisSafeguard.unstablemode) { - Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); - } - if (IrisSafeguard.warningmode) { - Iris.safeguard(C.YELLOW + "" + ServerBootSFG.count + " Conflicts found"); - } + if (ServerBootSFG.safeguardPassed) { + Iris.safeguard(C.BLUE + "0 Conflicts found"); + } else { + if (IrisSafeguard.unstablemode) { + Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); + } + if (IrisSafeguard.warningmode) { + Iris.safeguard(C.YELLOW + "" + ServerBootSFG.count + " Conflicts found"); + } - if (ServerBootSFG.incompatibilities.get("Multiverse-Core")) { - Iris.safeguard(C.RED + "Multiverse"); - Iris.safeguard(C.RED + "- The plugin Multiverse is not compatible with the server."); - Iris.safeguard(C.RED + "- If you want to have a world manager, consider using PhantomWorlds or MyWorlds instead."); - } - if (ServerBootSFG.incompatibilities.get("Dynmap")) { - Iris.safeguard(C.RED + "Dynmap"); - Iris.safeguard(C.RED + "- The plugin Dynmap is not compatible with the server."); - Iris.safeguard(C.RED + "- If you want to have a map plugin like Dynmap, consider Bluemap."); - } - if (ServerBootSFG.incompatibilities.get("TerraformGenerator") || ServerBootSFG.incompatibilities.get("Stratos")) { - Iris.safeguard(C.YELLOW + "Terraform Generator / Stratos"); - Iris.safeguard(C.YELLOW + "- Iris is not compatible with other worldgen plugins."); - } - if (ServerBootSFG.unsuportedversion) { - Iris.safeguard(C.RED + "Server Version"); - Iris.safeguard(C.RED + "- Iris only supports 1.19.2 > 1.20.2"); - } - if (!ServerBootSFG.passedserversoftware) { - Iris.safeguard(C.RED + "Unsupported Server Software"); - Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); - } - if (!ServerBootSFG.isJDK17) { - Iris.safeguard(C.YELLOW + "Unsupported java version"); - Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); - } - if (!ServerBootSFG.isJRE) { - Iris.safeguard(C.YELLOW + "Unsupported Server JDK"); - Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion()); - } - } - } + if (ServerBootSFG.incompatibilities.get("Multiverse-Core")) { + Iris.safeguard(C.RED + "Multiverse"); + Iris.safeguard(C.RED + "- The plugin Multiverse is not compatible with the server."); + Iris.safeguard(C.RED + "- If you want to have a world manager, consider using PhantomWorlds or MyWorlds instead."); + } + if (ServerBootSFG.incompatibilities.get("Dynmap")) { + Iris.safeguard(C.RED + "Dynmap"); + Iris.safeguard(C.RED + "- The plugin Dynmap is not compatible with the server."); + Iris.safeguard(C.RED + "- If you want to have a map plugin like Dynmap, consider Bluemap."); + } + if (ServerBootSFG.incompatibilities.get("TerraformGenerator") || ServerBootSFG.incompatibilities.get("Stratos")) { + Iris.safeguard(C.YELLOW + "Terraform Generator / Stratos"); + Iris.safeguard(C.YELLOW + "- Iris is not compatible with other worldgen plugins."); + } + if (ServerBootSFG.unsuportedversion) { + Iris.safeguard(C.RED + "Server Version"); + Iris.safeguard(C.RED + "- Iris only supports 1.19.2 > 1.20.2"); + } + if (!ServerBootSFG.passedserversoftware) { + Iris.safeguard(C.RED + "Unsupported Server Software"); + Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); + } + if (!ServerBootSFG.isJDK17) { + Iris.safeguard(C.YELLOW + "Unsupported java version"); + Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); + } + if (!ServerBootSFG.isJRE) { + Iris.safeguard(C.YELLOW + "Unsupported Server JDK"); + Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JRE " + Iris.getJavaVersion()); + } + } + } - public static String MSGIncompatibleWarnings() { - return ServerBootSFG.allIncompatibilities; - } + public static String MSGIncompatibleWarnings() { + return ServerBootSFG.allIncompatibilities; + } } From 5507c35547f88555ea5cbe4cfead5924909b8fa1 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 17 Dec 2023 17:42:28 +0100 Subject: [PATCH 41/66] new structure --- .../com/volmit/iris/core/IrisSettings.java | 2 - .../iris/core/commands/CommandDeveloper.java | 1 - .../volmit/iris/core/safeguard/ModesSFG.java | 2 +- .../iris/core/service/IrisEngineSVC.java | 137 ++++++----------- .../com/volmit/iris/util/mantle/Mantle.java | 145 +++++------------- 5 files changed, 86 insertions(+), 201 deletions(-) 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 20e11ceca..7d7b58256 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -142,8 +142,6 @@ public class IrisSettings { public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; public int tectonicUnloadThreads = -1; // -1 = Disabled and instead use the dynamic method - public boolean AggressiveTectonicUnload = false; - public int AggressiveTectonicThreshold = -1; // -1 = Disabled and instead uses the tectonicLimit } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 13f2cbb21..018329aff 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -63,7 +63,6 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize)); - Iris.info(C.DARK_PURPLE + "Agressive Unload: " + C.LIGHT_PURPLE + IrisSettings.get().getPerformance().AggressiveTectonicUnload); Iris.info("-------------------------"); } else { Iris.info(C.RED + "Engine is null!"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java index 3bd04d0db..babfcfac8 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ModesSFG.java @@ -52,7 +52,7 @@ public class ModesSFG { try { Thread.sleep(1000); } catch (InterruptedException e) { - // Handle interruption + // no } } } diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 3743b777c..93a306887 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -13,112 +13,51 @@ import org.bukkit.World; import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; public class IrisEngineSVC implements IrisService { - private JavaPlugin plugin; - public Looper ticker1; - public Looper ticker2; - public Looper engineTicker; - public World selectedWorld; - public List IrisWorlds = new ArrayList<>(); + public Looper trimTicker; + public Looper unloadTicker; public List corruptedIrisWorlds = new ArrayList<>(); // todo make this work with multiple worlds @Override public void onEnable() { - this.plugin = Iris.instance; tectonicLimit.set(2); long t = getHardware.getProcessMemory(); - for (; t > 250; ) { + while (t > 250) { tectonicLimit.getAndAdd(1); t = t - 250; } tectonicLimit.set(10); // DEBUG CODE - this.IrisEngine(); - engineTicker.start(); - ticker1.start(); - ticker2.start(); + this.setup(); + trimTicker.start(); + unloadTicker.start(); } - private final AtomicReference selectedWorldRef = new AtomicReference<>(); + private void setup() { + trimTicker = new Looper() { + private final Supplier supplier = createSupplier(); + private Engine engine = supplier.get(); - public CompletableFuture initializeAsync() { - return CompletableFuture.supplyAsync(() -> { - World selectedWorld = null; - while (selectedWorld == null) { - synchronized (this) { - IrisWorlds.clear(); - for (World w : Bukkit.getServer().getWorlds()) { - if (IrisToolbelt.access(w) != null) { - IrisWorlds.add(w); - } - } - if (!IrisWorlds.isEmpty()) { - Random rand = new Random(); - int randomIndex = rand.nextInt(IrisWorlds.size()); - selectedWorld = IrisWorlds.get(randomIndex); - } - } - if (selectedWorld == null) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return null; - } - } - } - return selectedWorld; - }); - } - - public void IrisEngine() { - engineTicker = new Looper() { @Override protected long loop() { try { - World world = selectedWorldRef.get(); - PlatformChunkGenerator generator = IrisToolbelt.access(world); - if (generator == null) { - initializeAsync().thenAcceptAsync(foundWorld -> selectedWorldRef.set(foundWorld)); - } else { - selectedWorld = world; - } - selectedWorld = Bukkit.getWorld("localmemtest"); // debug code - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - return -1; - } - - return 1000; - } - - }; - ticker1 = new Looper() { - @Override - protected long loop() { - try { - World world = selectedWorld; - PlatformChunkGenerator generator = IrisToolbelt.access(world); - if (generator != null) { - Engine engine = IrisToolbelt.access(world).getEngine(); - if (generator != null && generator.getEngine() != null) { - engine.getMantle().trim(); - } else { - Iris.info("something is null 1"); - } - + if (engine != null) { + engine.getMantle().trim(); } + engine = supplier.get(); } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -129,20 +68,17 @@ public class IrisEngineSVC implements IrisService { } }; - ticker2 = new Looper() { + unloadTicker = new Looper() { + private final Supplier supplier = createSupplier(); + private Engine engine = supplier.get(); + @Override protected long loop() { try { - World world = selectedWorld; - PlatformChunkGenerator generator = IrisToolbelt.access(world); - if (generator != null) { - Engine engine = IrisToolbelt.access(world).getEngine(); - if (generator != null && generator.getEngine() != null) { - engine.getMantle().unloadTectonicPlate(); - } else { - Iris.info("something is null 2"); - } + if (engine != null) { + engine.getMantle().unloadTectonicPlate(); } + engine = supplier.get(); } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); @@ -153,11 +89,30 @@ public class IrisEngineSVC implements IrisService { }; } + private Supplier createSupplier() { + AtomicInteger i = new AtomicInteger(); + return () -> { + List worlds = Bukkit.getWorlds(); + if (i.get() >= worlds.size()) { + i.set(0); + } + for (int j = 0; j < worlds.size(); j++) { + PlatformChunkGenerator generator = IrisToolbelt.access(worlds.get(i.getAndIncrement())); + if (i.get() >= worlds.size()) { + i.set(0); + } + + if (generator != null && generator.getEngine() != null) { + return generator.getEngine(); + } + } + return null; + }; + } + @Override public void onDisable() { - ticker1.interrupt(); - ticker2.interrupt(); - engineTicker.interrupt(); + trimTicker.interrupt(); + unloadTicker.interrupt(); } } - 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 b67d52812..4a8d8b07d 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 @@ -60,17 +60,16 @@ import java.util.concurrent.atomic.AtomicLong; public class Mantle { private final File dataFolder; + @Getter private final int worldHeight; private final Map lastUse; @Getter private final Map loadedRegions; private final HyperLock hyperLock; - private final KSet unload; private final AtomicBoolean closed; private final MultiBurst ioBurst; private final AtomicBoolean ioTrim; private final AtomicBoolean ioTectonicUnload; - public Looper ticker; /** * Create a new mantle @@ -87,7 +86,6 @@ public class Mantle { this.ioTrim = new AtomicBoolean(false); this.ioTectonicUnload = new AtomicBoolean(false); dataFolder.mkdirs(); - unload = new KSet<>(); loadedRegions = new KMap<>(); lastUse = new KMap<>(); ioBurst = MultiBurst.burst; @@ -416,124 +414,63 @@ public class Mantle { throw new RuntimeException("The Mantle is closed"); } Iris.debug(C.BLUE + "TECTONIC TRIM HAS RUN"); - if (IrisSettings.get().getPerformance().getAggressiveTectonicThreshold() == -1) { - forceAggressiveThreshold.set(tectonicLimit.get()); - } else { - forceAggressiveThreshold.set(IrisSettings.get().getPerformance().getAggressiveTectonicThreshold()); - } adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions != null) { if (loadedRegions.size() > tectonicLimit.get()) { // todo update this correctly and maybe do something when its above a 100% - int tectonicLimitValue = tectonicLimit.get(); - adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); + int tectonicLimitValue = tectonicLimit.get(); + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); } } ioTrim.set(true); - try { - Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); - if (lastUse != null) { - for (Long i : new ArrayList<>(lastUse.keySet())) { - double finalAdjustedIdleDuration = adjustedIdleDuration.get(); - hyperLock.withLong(i, () -> { - Long lastUseTime = lastUse.get(i); - if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) { - toUnload.add(i); - Iris.debug("Tectonic Region added to unload"); - } - }); + try { + Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); + if (lastUse != null) { + for (Long i : new ArrayList<>(lastUse.keySet())) { + double finalAdjustedIdleDuration = adjustedIdleDuration.get(); + hyperLock.withLong(i, () -> { + Long lastUseTime = lastUse.get(i); + if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) { + toUnload.add(i); + Iris.debug("Tectonic Region added to unload"); } + }); } - - if (IrisSettings.get().getPerformance().AggressiveTectonicUnload - && loadedRegions.size() > forceAggressiveThreshold.get()) { - - AtomicInteger regionCountToRemove = new AtomicInteger(0); - if (loadedRegions.size() > tectonicLimit.get()) { - regionCountToRemove.set(loadedRegions.size() - tectonicLimit.get()); - } - - while (regionCountToRemove.get() > 0) { - Long[] oldestKey = {null}; - long[] oldestAge = {Long.MIN_VALUE}; - - for (Long key : lastUse.keySet()) { - hyperLock.withLong(key, () -> { - if (!toUnload.contains(key)) { - long age = M.ms() - lastUse.get(key); - if (age > oldestAge[0]) { - oldestAge[0] = age; - oldestKey[0] = key; - } - } - }); - } - - if (oldestKey[0] != null) { - Long finalOldestKey = oldestKey[0]; - hyperLock.withLong(finalOldestKey, () -> { - toUnload.add(finalOldestKey); - Iris.debug("Oldest Tectonic Region " + finalOldestKey + " added to unload"); - regionCountToRemove.getAndDecrement(); - }); - } - } - } - } finally { - ioTrim.set(false); } + + } finally { + ioTrim.set(false); + } } - public synchronized void unloadTectonicPlate() { - long time = System.currentTimeMillis(); - try { - Iris.debug(C.DARK_BLUE + "TECTONIC UNLOAD HAS RUN"); - int threadCount = 1; - ExecutorService executorService = Executors.newFixedThreadPool(threadCount); - List toUnloadList; - synchronized (toUnload) { - toUnloadList = new ArrayList<>(toUnload); + public void unloadTectonicPlate() { + try { + for (Long id : new ArrayList<>(toUnload)) { + hyperLock.withLong(id, () -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnload.remove(id); + Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + } catch (IOException e) { + e.printStackTrace(); + } } - - int chunkSize = (int) Math.ceil(toUnloadList.size() / (double) threadCount); - - for (int i = 0; i < threadCount; i++) { - int start = i * chunkSize; - int end = Math.min(start + chunkSize, toUnloadList.size()); - List sublist = toUnloadList.subList(start, end); - - executorService.submit(() -> { - for (Long id : sublist) { - hyperLock.withLong(id, () -> { - TectonicPlate m = loadedRegions.get(id); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, id)); - loadedRegions.remove(id); - lastUse.remove(id); - toUnload.remove(id); - Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - } - }); - } - - executorService.shutdown(); - executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); - } catch (Exception e) { - e.printStackTrace(); - } - + }); + } + } catch (Exception e) { + e.printStackTrace(); + } ioTectonicUnload.set(true); } + /** * This retreives a future of the Tectonic Plate at the given coordinates. * All methods accessing tectonic plates should go through this method @@ -639,10 +576,6 @@ public class Mantle { } - public int getWorldHeight() { - return worldHeight; - } - public MantleChunk getChunk(Chunk e) { return getChunk(e.getX(), e.getZ()); } From 37f76fa133be020fca8748f53bfd556b8a7072a2 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Wed, 20 Dec 2023 14:43:37 +0100 Subject: [PATCH 42/66] Dynamically define tectonicLimit and cooldown --- .../iris/core/commands/CommandDeveloper.java | 3 +- .../core/pregenerator/IrisPregenerator.java | 2 +- .../iris/core/service/IrisEngineSVC.java | 94 ++++++++++++------- .../volmit/iris/engine/framework/Engine.java | 3 +- .../iris/engine/mantle/EngineMantle.java | 11 +-- .../com/volmit/iris/util/mantle/Mantle.java | 9 +- 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 018329aff..2d2286fa6 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -21,6 +21,7 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.service.IrisEngineSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.EngineMantle; @@ -56,7 +57,7 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info("-------------------------"); Iris.info(C.DARK_PURPLE + "Engine Status"); Iris.info(C.DARK_PURPLE + "Tectonic Threads: " + C.LIGHT_PURPLE + engine.getMantle().getDynamicThreads()); - Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); + Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + IrisEngineSVC.getTectonicLimit()); Iris.info(C.DARK_PURPLE + "Tectonic Loaded Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getNotClearedLoadedRegions()); Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload()); diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index 513600a95..11128d04a 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -167,7 +167,7 @@ public class IrisPregenerator { generator.close(); ticker.interrupt(); listener.onClose(); - getMantle().trim(0); + getMantle().trim(0, 0); } private void visitRegion(int x, int z, boolean regions) { diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 93a306887..6dcca86fb 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -4,30 +4,24 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.plugin.IrisService; -import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; -import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; -import static com.volmit.iris.util.mantle.Mantle.tectonicLimit; - public class IrisEngineSVC implements IrisService { - public Looper trimTicker; - public Looper unloadTicker; + private static final AtomicInteger tectonicLimit = new AtomicInteger(30); + private final KMap cache = new KMap<>(); + private Looper cacheTicker; + private Looper trimTicker; + private Looper unloadTicker; public List corruptedIrisWorlds = new ArrayList<>(); // todo make this work with multiple worlds @@ -42,49 +36,73 @@ public class IrisEngineSVC implements IrisService { } tectonicLimit.set(10); // DEBUG CODE this.setup(); + cacheTicker.start(); trimTicker.start(); unloadTicker.start(); } - private void setup() { - trimTicker = new Looper() { - private final Supplier supplier = createSupplier(); - private Engine engine = supplier.get(); + public static int getTectonicLimit() { + return tectonicLimit.get(); + } + private void setup() { + cacheTicker = new Looper() { @Override protected long loop() { - try { - if (engine != null) { - engine.getMantle().trim(); + long now = System.currentTimeMillis(); + for (Engine key : cache.keySet()) { + long last = cache.get(key); + if (now - last > 600000) { // 10 minutes + cache.remove(key); + } + } + return 1000; + } + }; + trimTicker = new Looper() { + private final Supplier supplier = createSupplier(); + @Override + protected long loop() { + long start = System.currentTimeMillis(); + try { + Engine engine = supplier.get(); + if (engine != null) { + engine.getMantle().trim(tectonicLimit.get() / cache.size()); } - engine = supplier.get(); } catch (Throwable e) { Iris.reportError(e); - e.printStackTrace(); return -1; } - return 1000; + int size = cache.size(); + long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); + if (time <= 0) + return 0; + return time; } }; unloadTicker = new Looper() { private final Supplier supplier = createSupplier(); - private Engine engine = supplier.get(); @Override protected long loop() { + long start = System.currentTimeMillis(); try { + Engine engine = supplier.get(); if (engine != null) { engine.getMantle().unloadTectonicPlate(); } - engine = supplier.get(); } catch (Throwable e) { Iris.reportError(e); - e.printStackTrace(); return -1; } - return 1000; + + int size = cache.size(); + long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); + if (time <= 0) + return 0; + return time; } }; } @@ -96,15 +114,23 @@ public class IrisEngineSVC implements IrisService { if (i.get() >= worlds.size()) { i.set(0); } - for (int j = 0; j < worlds.size(); j++) { - PlatformChunkGenerator generator = IrisToolbelt.access(worlds.get(i.getAndIncrement())); - if (i.get() >= worlds.size()) { - i.set(0); - } + try { + for (int j = 0; j < worlds.size(); j++) { + PlatformChunkGenerator generator = IrisToolbelt.access(worlds.get(i.getAndIncrement())); + if (i.get() >= worlds.size()) { + i.set(0); + } - if (generator != null && generator.getEngine() != null) { - return generator.getEngine(); + if (generator != null) { + Engine engine = generator.getEngine(); + if (engine != null) { + cache.put(engine, System.currentTimeMillis()); + return engine; + } + } } + } catch (Throwable e) { + Iris.reportError(e); } return null; }; @@ -112,7 +138,9 @@ public class IrisEngineSVC implements IrisService { @Override public void onDisable() { + cacheTicker.interrupt(); trimTicker.interrupt(); unloadTicker.interrupt(); + cache.clear(); } } diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 11249b1f6..31bba630e 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -523,8 +523,9 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat return getTarget().getBurster(); } + @Deprecated default void clean() { - burst().lazy(() -> getMantle().trim()); + burst().lazy(() -> getMantle().trim(10)); } @BlockCoordinates diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index c6d234c2e..8fee0baaf 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -143,8 +143,8 @@ public interface EngineMantle extends IObjectPlacer { return getEngine().getDimension().isDebugSmartBore(); } - default void trim(long dur) { - getMantle().trim(dur); + default void trim(long dur, int limit) { + getMantle().trim(dur, limit); } default IrisData getData() { @@ -175,8 +175,8 @@ public interface EngineMantle extends IObjectPlacer { } - default void trim() { - getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive())); + default void trim(int limit) { + getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()), limit); } default void unloadTectonicPlate(){ getMantle().unloadTectonicPlate(); @@ -301,9 +301,6 @@ public interface EngineMantle extends IObjectPlacer { default long getDynamicThreads(){ return getMantle().getDynamicThreads().get(); } - default double getTectonicLimit(){ - return Mantle.tectonicLimit.get(); - } default long getNotClearedLoadedRegions(){ return getMantle().getLoadedRegions().size() - getMantle().getToUnload().size(); } 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 4a8d8b07d..a52b8dbb9 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 @@ -392,7 +392,6 @@ public class Mantle { @Getter private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); - public static final AtomicInteger tectonicLimit = new AtomicInteger(30); @Getter private final AtomicInteger dynamicThreads = new AtomicInteger(4); @Getter @@ -401,7 +400,6 @@ public class Mantle { private final AtomicLong oldestTectonicPlate = new AtomicLong(0); @Getter public final Set toUnload = new HashSet<>(); - private int g = 0; /** * Save & unload regions that have not been used for more than the @@ -409,7 +407,7 @@ public class Mantle { * * @param baseIdleDuration the duration */ - public synchronized void trim(long baseIdleDuration) { + public synchronized void trim(long baseIdleDuration, int tectonicLimit) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } @@ -418,10 +416,9 @@ public class Mantle { adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions != null) { - if (loadedRegions.size() > tectonicLimit.get()) { + if (loadedRegions.size() > tectonicLimit) { // todo update this correctly and maybe do something when its above a 100% - int tectonicLimitValue = tectonicLimit.get(); - adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimitValue) / (double) tectonicLimitValue) * 100) * 0.4), 4000)); + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (((loadedRegions.size() - tectonicLimit) / (double) tectonicLimit) * 100) * 0.4), 4000)); } } From 4580f8d9a48c92439c473e2678138bcfc013e0ad Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 21 Dec 2023 12:21:20 +0100 Subject: [PATCH 43/66] fix StackOverflowError --- .../main/java/com/volmit/iris/core/loader/ResourceLoader.java | 4 ++++ core/src/main/java/com/volmit/iris/engine/IrisComplex.java | 4 ++++ core/src/main/java/com/volmit/iris/engine/IrisEngine.java | 4 ++++ .../main/java/com/volmit/iris/engine/IrisEngineMantle.java | 4 ++++ .../java/com/volmit/iris/engine/IrisExecutionEnvironment.java | 4 ++++ .../volmit/iris/engine/framework/EngineAssignedComponent.java | 4 ++++ .../java/com/volmit/iris/engine/framework/EngineTarget.java | 4 ++++ .../com/volmit/iris/engine/mantle/IrisMantleComponent.java | 4 ++++ .../com/volmit/iris/engine/scripting/IrisScriptingAPI.java | 4 ++++ 9 files changed, 36 insertions(+) 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 8b4900972..dd0a1b068 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 @@ -40,6 +40,8 @@ import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import java.io.*; import java.util.Locale; @@ -52,6 +54,8 @@ import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @Data +@EqualsAndHashCode(exclude = "manager") +@ToString(exclude = "manager") public class ResourceLoader implements MeteredCache { public static final AtomicDouble tlt = new AtomicDouble(0); private static final int CACHE_SIZE = 100000; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java index 989aa0ef9..db92954a8 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -35,6 +35,8 @@ import com.volmit.iris.util.noise.CNG; import com.volmit.iris.util.stream.ProceduralStream; import com.volmit.iris.util.stream.interpolation.Interpolated; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -42,6 +44,8 @@ import org.bukkit.block.data.BlockData; import java.util.UUID; @Data +@EqualsAndHashCode(exclude = "data") +@ToString(exclude = "data") public class IrisComplex implements DataProvider { private static final BlockData AIR = Material.AIR.createBlockData(); private RNG rng; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index 4531754f4..d1eea7cc3 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -50,6 +50,8 @@ import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -64,6 +66,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @Data +@EqualsAndHashCode(exclude = "context") +@ToString(exclude = "context") public class IrisEngine implements Engine { private final AtomicInteger bud; private final AtomicInteger buds; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java index 3a2cb9cdd..f61d90531 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -38,6 +38,8 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.parallel.BurstExecutor; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.bukkit.util.BlockVector; import java.io.File; @@ -49,6 +51,8 @@ import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; import static com.volmit.iris.core.safeguard.PerformanceSFG.*; @Data +@EqualsAndHashCode(exclude = "engine") +@ToString(exclude = "engine") public class IrisEngineMantle implements EngineMantle { private final Engine engine; private final Mantle mantle; diff --git a/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java b/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java index 4420600a4..51ca6d1f9 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisExecutionEnvironment.java @@ -25,11 +25,15 @@ import com.volmit.iris.engine.scripting.EngineExecutionEnvironment; import com.volmit.iris.engine.scripting.IrisScriptingAPI; import com.volmit.iris.util.format.C; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.apache.bsf.BSFException; import org.apache.bsf.BSFManager; import org.apache.bsf.engines.javascript.JavaScriptEngine; @Data +@EqualsAndHashCode(exclude = "engine") +@ToString(exclude = "engine") public class IrisExecutionEnvironment implements EngineExecutionEnvironment { private final BSFManager manager; private final Engine engine; diff --git a/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java index a9e83e95c..b356eb722 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/EngineAssignedComponent.java @@ -21,8 +21,12 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.Iris; import com.volmit.iris.util.math.RollingSequence; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; @Data +@EqualsAndHashCode(exclude = "engine") +@ToString(exclude = "engine") public class EngineAssignedComponent implements EngineComponent { private final Engine engine; private final RollingSequence metrics; diff --git a/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index cd33cf998..7e9388ffb 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -23,8 +23,12 @@ import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisWorld; import com.volmit.iris.util.parallel.MultiBurst; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; @Data +@EqualsAndHashCode(exclude = "data") +@ToString(exclude = "data") public class EngineTarget { private final MultiBurst burster; private final IrisData data; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java index 16c71652d..48e33957a 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java @@ -20,8 +20,12 @@ package com.volmit.iris.engine.mantle; import com.volmit.iris.util.mantle.MantleFlag; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; @Data +@EqualsAndHashCode(exclude = "engineMantle") +@ToString(exclude = "engineMantle") public abstract class IrisMantleComponent implements MantleComponent { private final EngineMantle engineMantle; private final MantleFlag flag; diff --git a/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java b/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java index c0a3e35d9..ae613c48f 100644 --- a/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java +++ b/core/src/main/java/com/volmit/iris/engine/scripting/IrisScriptingAPI.java @@ -27,10 +27,14 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisExpression; import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.bukkit.Location; import org.bukkit.entity.Entity; @Data +@EqualsAndHashCode(exclude = "engine") +@ToString(exclude = "engine") public class IrisScriptingAPI { private final Engine engine; private IrisRegistrant preprocessorObject; From 4595fea7d73b1834c144423dee5325774dc150fb Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 21 Dec 2023 12:34:14 +0100 Subject: [PATCH 44/66] fix NullPointerException --- .../main/java/com/volmit/iris/core/service/IrisEngineSVC.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 6dcca86fb..8d6db5b0a 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -51,7 +51,9 @@ public class IrisEngineSVC implements IrisService { protected long loop() { long now = System.currentTimeMillis(); for (Engine key : cache.keySet()) { - long last = cache.get(key); + Long last = cache.get(key); + if (last == null) + continue; if (now - last > 600000) { // 10 minutes cache.remove(key); } From a7b471682a831efa3e7ca3217fdb30e6d3dbb648 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 21 Dec 2023 15:39:26 +0100 Subject: [PATCH 45/66] try this out --- .../main/java/com/volmit/iris/util/mantle/TectonicPlate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index bea18ba3a..1fb1732ab 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -168,7 +168,7 @@ public class TectonicPlate { DataOutputStream dos = new DataOutputStream(gzo); write(dos); dos.close(); - Iris.debug("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2)); + Iris.info("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2)); } /** From db40f608fa61c75345344e69207dd2e2beecb2ea Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 21 Dec 2023 15:39:26 +0100 Subject: [PATCH 46/66] try this out --- .../main/java/com/volmit/iris/util/mantle/TectonicPlate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index bea18ba3a..1fb1732ab 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -168,7 +168,7 @@ public class TectonicPlate { DataOutputStream dos = new DataOutputStream(gzo); write(dos); dos.close(); - Iris.debug("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2)); + Iris.info("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2)); } /** From 130cb7ad93e5696230360462350638ada4953084 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Thu, 21 Dec 2023 22:04:19 +0100 Subject: [PATCH 47/66] So that works --- .../com/volmit/iris/util/mantle/Mantle.java | 68 +++++++++++++++---- 1 file changed, 53 insertions(+), 15 deletions(-) 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 4a8d8b07d..c891ec6a6 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 @@ -401,6 +401,8 @@ public class Mantle { private final AtomicLong oldestTectonicPlate = new AtomicLong(0); @Getter public final Set toUnload = new HashSet<>(); + @Getter + public final Set toUnloadAsync = new HashSet<>(); private int g = 0; /** @@ -447,25 +449,61 @@ public class Mantle { } public void unloadTectonicPlate() { - try { - for (Long id : new ArrayList<>(toUnload)) { - hyperLock.withLong(id, () -> { - TectonicPlate m = loadedRegions.get(id); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, id)); - loadedRegions.remove(id); - lastUse.remove(id); - toUnload.remove(id); - Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); - } catch (IOException e) { - e.printStackTrace(); + if (tectonicLimit.get() > toUnload.size()) { + try { + for (Long id : new ArrayList<>(toUnload)) { + hyperLock.withLong(id, () -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnload.remove(id); + Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + } catch (IOException e) { + e.printStackTrace(); + } } + }); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + try { + int u = toUnload.size(); + for (Long i : new ArrayList<>(toUnload)) { + toUnloadAsync.add(i); + toUnload.remove(i); + if (u <= toUnloadAsync.size()) { + break; + } + } + BurstExecutor b = MultiBurst.burst.burst(toUnloadAsync.size()); + b.setMulticore(true); + b.queue(() -> { + for (Long id : new ArrayList<>(toUnloadAsync)) { + hyperLock.withLong(id, () -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnloadAsync.remove(id); + Iris.info("Async Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); } }); + b.complete(); + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } ioTectonicUnload.set(true); } From 650d38e2127a5435fd3927892651cfe618e05bff Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 21 Dec 2023 22:30:08 +0100 Subject: [PATCH 48/66] Implement MultiThreading in the TectonicPlates unloader --- .../iris/core/service/IrisEngineSVC.java | 8 +++- .../iris/engine/mantle/EngineMantle.java | 4 +- .../com/volmit/iris/util/mantle/Mantle.java | 46 ++++++++++++------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 8d6db5b0a..299137b0b 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -5,6 +5,8 @@ import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.scheduling.Looper; @@ -93,7 +95,11 @@ public class IrisEngineSVC implements IrisService { try { Engine engine = supplier.get(); if (engine != null) { - engine.getMantle().unloadTectonicPlate(); + long unloadStart = System.currentTimeMillis(); + int count = engine.getMantle().unloadTectonicPlate(); + if (count > 0) { + Iris.info("Unloaded TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); + } } } catch (Throwable e) { Iris.reportError(e); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 8fee0baaf..fe17b0655 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -178,8 +178,8 @@ public interface EngineMantle extends IObjectPlacer { default void trim(int limit) { getMantle().trim(TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()), limit); } - default void unloadTectonicPlate(){ - getMantle().unloadTectonicPlate(); + default int unloadTectonicPlate(){ + return getMantle().unloadTectonicPlate(); } default MultiBurst burst() { 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 a52b8dbb9..a26bef786 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 @@ -399,7 +399,7 @@ public class Mantle { @Getter private final AtomicLong oldestTectonicPlate = new AtomicLong(0); @Getter - public final Set toUnload = new HashSet<>(); + private Set toUnload = new HashSet<>(); /** * Save & unload regions that have not been used for more than the @@ -443,28 +443,42 @@ public class Mantle { } } - public void unloadTectonicPlate() { + public int unloadTectonicPlate() { + AtomicInteger i = new AtomicInteger(); + Set toUnload = this.toUnload; + this.toUnload = new HashSet<>(); try { + List> futures = new ArrayList<>(); + ExecutorService service = Executors.newFixedThreadPool(dynamicThreads.get()); for (Long id : new ArrayList<>(toUnload)) { - hyperLock.withLong(id, () -> { - TectonicPlate m = loadedRegions.get(id); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, id)); - loadedRegions.remove(id); - lastUse.remove(id); - toUnload.remove(id); - Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); - } catch (IOException e) { - e.printStackTrace(); - } - } - }); + hyperLock.withLong(id, () -> + futures.add(service.submit(() -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnload.remove(id); + i.incrementAndGet(); + Iris.info("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + } catch (IOException e) { + e.printStackTrace(); + } + } + }))); } + while (!futures.isEmpty()) { + futures.remove(0).get(); + } + service.shutdown(); } catch (Exception e) { e.printStackTrace(); + } finally { + this.toUnload.addAll(toUnload); } ioTectonicUnload.set(true); + return i.get(); } From 1a786fb418a579bc7851769cdef615f6c4e37749 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 21 Dec 2023 22:36:05 +0100 Subject: [PATCH 49/66] give hyperLock a purpose again --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a26bef786..4d0348343 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 @@ -451,8 +451,8 @@ public class Mantle { List> futures = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(dynamicThreads.get()); for (Long id : new ArrayList<>(toUnload)) { - hyperLock.withLong(id, () -> - futures.add(service.submit(() -> { + futures.add(service.submit(() -> + hyperLock.withLong(id, () -> { TectonicPlate m = loadedRegions.get(id); if (m != null) { try { From b3a087702d20a0a10f77fcfdf1a28372512b9bb0 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Thu, 21 Dec 2023 22:36:50 +0100 Subject: [PATCH 50/66] show unloaded tectonicplates count --- .../main/java/com/volmit/iris/core/service/IrisEngineSVC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 299137b0b..67854a444 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -98,7 +98,7 @@ public class IrisEngineSVC implements IrisService { long unloadStart = System.currentTimeMillis(); int count = engine.getMantle().unloadTectonicPlate(); if (count > 0) { - Iris.info("Unloaded TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); + Iris.info("Unloaded " + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); } } } catch (Throwable e) { From 167c865bb2616cdd8dcc0b506bf49605177d717c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 22 Dec 2023 09:00:57 +0100 Subject: [PATCH 51/66] e --- .../main/java/com/volmit/iris/core/service/IrisEngineSVC.java | 2 +- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 67854a444..2c80ecbaf 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -98,7 +98,7 @@ public class IrisEngineSVC implements IrisService { long unloadStart = System.currentTimeMillis(); int count = engine.getMantle().unloadTectonicPlate(); if (count > 0) { - Iris.info("Unloaded " + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); + Iris.info(C.GOLD + "Unloaded " + C.YELLOW + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); } } } catch (Throwable e) { 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 4d0348343..30a19c3fd 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 @@ -393,7 +393,7 @@ public class Mantle { @Getter private final AtomicDouble adjustedIdleDuration = new AtomicDouble(0); @Getter - private final AtomicInteger dynamicThreads = new AtomicInteger(4); + private final AtomicInteger dynamicThreads = new AtomicInteger(1); @Getter private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); @Getter From 1e96fd529beb65a9a7f71f43d82d7cae108d61cf Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 11:17:55 +0100 Subject: [PATCH 52/66] increase unload speed --- core/build.gradle | 1 + .../com/volmit/iris/util/mantle/Mantle.java | 20 +++++++++------- .../iris/util/mantle/TectonicPlate.java | 23 +++++++++++++++---- core/src/main/resources/plugin.yml | 1 + 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 76a806aa6..7295f5c3a 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -52,6 +52,7 @@ dependencies { implementation 'org.apache.logging.log4j:log4j-core:2.19.0' implementation 'commons-lang:commons-lang:2.6' implementation 'com.github.oshi:oshi-core:5.8.5' + compileOnly 'org.lz4:lz4-java:1.8.0' // Third Party Integrations implementation 'com.ticxo.playeranimator:PlayerAnimator:R1.2.7' 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 30a19c3fd..011e9b47e 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 @@ -27,7 +27,6 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.MantleWriter; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.documentation.RegionCoordinates; @@ -40,7 +39,6 @@ import com.volmit.iris.util.matter.MatterSlice; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; -import com.volmit.iris.util.scheduling.Looper; import lombok.Getter; import org.bukkit.Chunk; @@ -112,7 +110,7 @@ public class Mantle { * @return the file */ public static File fileForRegion(File folder, Long key) { - File f = new File(folder, "p." + key + ".ttp"); + File f = new File(folder, "p." + key + ".ttp.lz4"); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } @@ -447,10 +445,11 @@ public class Mantle { AtomicInteger i = new AtomicInteger(); Set toUnload = this.toUnload; this.toUnload = new HashSet<>(); + toUnload.removeIf(Objects::isNull); try { List> futures = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(dynamicThreads.get()); - for (Long id : new ArrayList<>(toUnload)) { + for (long id : new ArrayList<>(toUnload)) { futures.add(service.submit(() -> hyperLock.withLong(id, () -> { TectonicPlate m = loadedRegions.get(id); @@ -468,10 +467,13 @@ public class Mantle { } }))); } - while (!futures.isEmpty()) { - futures.remove(0).get(); - } - service.shutdown(); + + try { + while (!futures.isEmpty()) { + futures.remove(0).get(); + } + service.shutdown(); + } catch (InterruptedException ignored) {} } catch (Exception e) { e.printStackTrace(); } finally { @@ -549,6 +551,8 @@ public class Mantle { } File file = fileForRegion(dataFolder, x, z); + if (!file.exists()) + file = new File(dataFolder, file.getName().substring(".lz4".length())); if (file.exists()) { try { diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index 1fb1732ab..a93cb9c4d 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -26,6 +26,9 @@ import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; +import net.jpountz.lz4.LZ4BlockInputStream; +import net.jpountz.lz4.LZ4FrameInputStream; +import net.jpountz.lz4.LZ4FrameOutputStream; import java.io.*; import java.util.concurrent.atomic.AtomicReferenceArray; @@ -79,8 +82,14 @@ public class TectonicPlate { public static TectonicPlate read(int worldHeight, File file) throws IOException, ClassNotFoundException { FileInputStream fin = new FileInputStream(file); - GZIPInputStream gzi = new GZIPInputStream(fin); - DataInputStream din = new DataInputStream(gzi); + DataInputStream din; + if (file.getName().endsWith("ttp")) { + GZIPInputStream gzi = new GZIPInputStream(fin); + din = new DataInputStream(gzi); + } else { + LZ4FrameInputStream lz4 = new LZ4FrameInputStream(fin); + din = new DataInputStream(lz4); + } TectonicPlate p = new TectonicPlate(worldHeight, din); din.close(); @@ -164,8 +173,14 @@ public class TectonicPlate { public void write(File file) throws IOException { PrecisionStopwatch p = PrecisionStopwatch.start(); FileOutputStream fos = new FileOutputStream(file); - GZIPOutputStream gzo = new GZIPOutputStream(fos); - DataOutputStream dos = new DataOutputStream(gzo); + DataOutputStream dos; + if (file.getName().endsWith("ttp")) { + GZIPOutputStream gzo = new GZIPOutputStream(fos); + dos = new DataOutputStream(gzo); + } else { + LZ4FrameOutputStream lz4 = new LZ4FrameOutputStream(fos); + dos = new DataOutputStream(lz4); + } write(dos); dos.close(); Iris.info("Saved Tectonic Plate " + C.DARK_GREEN + file.getName().split("\\Q.\\E")[0] + C.RED + " in " + Form.duration(p.getMilliseconds(), 2)); diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml index 052267332..920607433 100644 --- a/core/src/main/resources/plugin.yml +++ b/core/src/main/resources/plugin.yml @@ -17,6 +17,7 @@ libraries: - org.ow2.asm:asm:9.2 - rhino:js:1.7R2 - bsf:bsf:2.4.0 + - org.lz4:lz4-java:1.8.0 commands: iris: aliases: [ ir, irs ] From f6440bde07e9549a44a15680e10ca65b36e9e46e Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 22 Dec 2023 15:33:22 +0100 Subject: [PATCH 53/66] - Added Sufficient Permission check --- .../iris/core/safeguard/ServerBootSFG.java | 24 +++++++++++++++++++ .../volmit/iris/core/safeguard/UtilsSFG.java | 4 ++++ .../iris/util/mantle/TectonicPlate.java | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 4cf20c30f..0fe8169ce 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -19,6 +19,7 @@ public class ServerBootSFG { public static final Map incompatibilities = new HashMap<>(); public static boolean isJDK17 = true; public static boolean isJRE = false; + public static boolean hasPrivileges = false; public static boolean unsuportedversion = false; protected static boolean safeguardPassed; public static boolean passedserversoftware = true; @@ -82,6 +83,11 @@ public class ServerBootSFG { joiner.add("Unsupported JDK"); severityMedium++; } + if (!hasPrivileges()){ + hasPrivileges = true; + joiner.add("Has insufficient Privileges"); + severityHigh++; + } allIncompatibilities = joiner.toString(); @@ -122,6 +128,24 @@ public class ServerBootSFG { return path != null && checkJavac(path + File.separator + "bin"); } + public static boolean hasPrivileges() { + File pv = new File(Bukkit.getWorldContainer() + "iristest.json"); + if (pv.exists()){ + pv.delete(); + } + try { + if (pv.createNewFile()){ + if (pv.canWrite() && pv.canRead()){ + pv.delete(); + return true; + } + } + } catch (Exception e){ + return false; + } + return false; + } + private static boolean checkJavac(String path) { return !path.isEmpty() && (new File(path, "javac").exists() || new File(path, "javac.exe").exists()); } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index b0cd659d6..49f1d9476 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -43,6 +43,10 @@ public class UtilsSFG { Iris.safeguard(C.RED + "Unsupported Server Software"); Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); } + if (!ServerBootSFG.hasPrivileges) { + Iris.safeguard(C.RED + "Insufficient Privileges"); + Iris.safeguard(C.RED + "- The server has insufficient Privileges to run iris. Please contact support."); + } if (!ServerBootSFG.isJDK17) { Iris.safeguard(C.YELLOW + "Unsupported java version"); Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index a93cb9c4d..a916ea1d8 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -83,7 +83,7 @@ public class TectonicPlate { public static TectonicPlate read(int worldHeight, File file) throws IOException, ClassNotFoundException { FileInputStream fin = new FileInputStream(file); DataInputStream din; - if (file.getName().endsWith("ttp")) { + if (file.getName().endsWith("ttp.lz4")) { GZIPInputStream gzi = new GZIPInputStream(fin); din = new DataInputStream(gzi); } else { @@ -174,7 +174,7 @@ public class TectonicPlate { PrecisionStopwatch p = PrecisionStopwatch.start(); FileOutputStream fos = new FileOutputStream(file); DataOutputStream dos; - if (file.getName().endsWith("ttp")) { + if (file.getName().endsWith("ttp.lz4")) { GZIPOutputStream gzo = new GZIPOutputStream(fos); dos = new DataOutputStream(gzo); } else { From 779a56c3a14d90c37a1d79609f146dbad2191950 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 15:50:27 +0100 Subject: [PATCH 54/66] add compression test command --- .../iris/core/commands/CommandDeveloper.java | 104 +++++++++++++++++- 1 file changed, 99 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 2d2286fa6..969d74ade 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -19,23 +19,33 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.service.IrisEngineSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.mantle.TectonicPlate; +import com.volmit.iris.util.plugin.VolmitSender; +import net.jpountz.lz4.LZ4BlockInputStream; +import net.jpountz.lz4.LZ4BlockOutputStream; +import net.jpountz.lz4.LZ4FrameInputStream; +import net.jpountz.lz4.LZ4FrameOutputStream; +import org.apache.commons.lang.RandomStringUtils; import org.bukkit.Bukkit; import org.bukkit.World; -import java.util.concurrent.atomic.AtomicInteger; +import java.io.*; +import java.util.concurrent.*; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; @Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"}) public class CommandDeveloper implements DecreeExecutor { @@ -70,9 +80,93 @@ public class CommandDeveloper implements DecreeExecutor { } } @Decree(description = "Test", origin = DecreeOrigin.BOTH) - public void test(){ + public void test() { Iris.info("Test Developer CMD Executed"); } + + @Decree(description = "Test the compression algorithms") + public void compression( + @Param(description = "World") World world, + @Param(description = "File") String path, + @Param(description = "Algorithm") String algorithm, + @Param(description = "Amount of Tests") int amount) { + if (!IrisToolbelt.isIrisWorld(world)) { + sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList())); + return; + } + + File file = new File(path); + if (!file.exists()) return; + + Engine engine = IrisToolbelt.access(world).getEngine(); + if(engine != null) { + int height = engine.getTarget().getHeight(); + ExecutorService service = Executors.newFixedThreadPool(1); + VolmitSender sender = sender(); + service.submit(() -> { + try { + DataInputStream raw = new DataInputStream(new FileInputStream(file)); + TectonicPlate plate = new TectonicPlate(height, raw); + raw.close(); + + double d1 = 0; + double d2 = 0; + long size = 0; + File folder = new File("tmp"); + folder.mkdirs(); + for (int i = 0; i < amount; i++) { + File tmp = new File(folder, RandomStringUtils.randomAlphanumeric(10) + "." + algorithm + ".bin"); + DataOutputStream dos = createOutput(tmp, algorithm); + long start = System.currentTimeMillis(); + plate.write(dos); + dos.close(); + d1 += System.currentTimeMillis() - start; + if (size == 0) + size = tmp.length(); + start = System.currentTimeMillis(); + DataInputStream din = createInput(tmp, algorithm); + new TectonicPlate(height, din); + din.close(); + d2 += System.currentTimeMillis() - start; + tmp.delete(); + } + IO.delete(folder); + sender.sendMessage(algorithm + " is " + Form.fileSize(size) + " big after compression"); + sender.sendMessage(algorithm + " Took " + d2/amount + "ms to read"); + sender.sendMessage(algorithm + " Took " + d1/amount + "ms to write"); + } catch (Throwable e) { + e.printStackTrace(); + } + }); + service.shutdown(); + } else { + Iris.info(C.RED + "Engine is null!"); + } + } + + private DataInputStream createInput(File file, String algorithm) throws Throwable { + FileInputStream in = new FileInputStream(file); + + return new DataInputStream(switch (algorithm) { + case "gzip" -> new GZIPInputStream(in); + case "zip" -> new ZipInputStream(in); + case "lz4f" -> new LZ4FrameInputStream(in); + case "lz4b" -> new LZ4BlockInputStream(in); + default -> throw new IllegalStateException("Unexpected value: " + algorithm); + }); + } + + private DataOutputStream createOutput(File file, String algorithm) throws Throwable { + FileOutputStream out = new FileOutputStream(file); + + return new DataOutputStream(switch (algorithm) { + case "gzip" -> new GZIPOutputStream(out); + case "zip" -> new ZipOutputStream(out); + case "lz4f" -> new LZ4FrameOutputStream(out); + case "lz4b" -> new LZ4BlockOutputStream(out); + default -> throw new IllegalStateException("Unexpected value: " + algorithm); + }); + } } From 55ed9d7132baf19cb144e3829f0150ca8677804a Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 22 Dec 2023 15:59:05 +0100 Subject: [PATCH 55/66] - Added DiskSpace check --- .../iris/core/safeguard/ServerBootSFG.java | 19 ++++++++++++++++++- .../volmit/iris/core/safeguard/UtilsSFG.java | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 0fe8169ce..0a8b2983c 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -6,6 +6,7 @@ import com.volmit.iris.core.nms.v1X.NMSBinding1X; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; +import javax.print.attribute.standard.Severity; import java.io.File; import java.util.HashMap; import java.util.Map; @@ -18,6 +19,7 @@ import static com.volmit.iris.core.safeguard.IrisSafeguard.*; public class ServerBootSFG { public static final Map incompatibilities = new HashMap<>(); public static boolean isJDK17 = true; + public static boolean hasEnoughDiskSpace = false; public static boolean isJRE = false; public static boolean hasPrivileges = false; public static boolean unsuportedversion = false; @@ -85,7 +87,12 @@ public class ServerBootSFG { } if (!hasPrivileges()){ hasPrivileges = true; - joiner.add("Has insufficient Privileges"); + joiner.add("Insufficient Privileges"); + severityHigh++; + } + if (!enoughDiskSpace()){ + hasEnoughDiskSpace = false; + joiner.add("Insufficient Disk Space"); severityHigh++; } @@ -146,6 +153,16 @@ public class ServerBootSFG { return false; } + public static boolean enoughDiskSpace() { + File freeSpace = new File(Bukkit.getWorldContainer() + "."); + double gigabytes = freeSpace.getFreeSpace() / (1024.0 * 1024.0 * 1024.0); + if (gigabytes > 3){ + return true; + } else { + return false; + } + } + private static boolean checkJavac(String path) { return !path.isEmpty() && (new File(path, "javac").exists() || new File(path, "javac.exe").exists()); } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index 49f1d9476..b4dac8a9d 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -47,6 +47,10 @@ public class UtilsSFG { Iris.safeguard(C.RED + "Insufficient Privileges"); Iris.safeguard(C.RED + "- The server has insufficient Privileges to run iris. Please contact support."); } + if (!ServerBootSFG.hasEnoughDiskSpace) { + Iris.safeguard(C.RED + "Insufficient Disk Space"); + Iris.safeguard(C.RED + "- The server has insufficient Free DiskSpace to run iris required 3GB+."); + } if (!ServerBootSFG.isJDK17) { Iris.safeguard(C.YELLOW + "Unsupported java version"); Iris.safeguard(C.YELLOW + "- Please consider using JDK 17 Instead of JDK " + Iris.getJavaVersion()); From 4f888f16bcd9e492c5fb7b38d04607a91be98a0d Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 16:13:46 +0100 Subject: [PATCH 56/66] Add Compression Test Command --- .../com/volmit/iris/core/commands/CommandDeveloper.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 969d74ade..54450af8d 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -41,11 +41,10 @@ import org.bukkit.Bukkit; import org.bukkit.World; import java.io.*; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; @Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"}) public class CommandDeveloper implements DecreeExecutor { @@ -149,7 +148,6 @@ public class CommandDeveloper implements DecreeExecutor { return new DataInputStream(switch (algorithm) { case "gzip" -> new GZIPInputStream(in); - case "zip" -> new ZipInputStream(in); case "lz4f" -> new LZ4FrameInputStream(in); case "lz4b" -> new LZ4BlockInputStream(in); default -> throw new IllegalStateException("Unexpected value: " + algorithm); @@ -161,7 +159,6 @@ public class CommandDeveloper implements DecreeExecutor { return new DataOutputStream(switch (algorithm) { case "gzip" -> new GZIPOutputStream(out); - case "zip" -> new ZipOutputStream(out); case "lz4f" -> new LZ4FrameOutputStream(out); case "lz4b" -> new LZ4BlockOutputStream(out); default -> throw new IllegalStateException("Unexpected value: " + algorithm); From a28df78792997d9be1c508f9adc784ed224f9859 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 16:13:57 +0100 Subject: [PATCH 57/66] switch to lz4 block compression --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 4 ++-- .../main/java/com/volmit/iris/util/mantle/TectonicPlate.java | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) 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 011e9b47e..7b101cd2f 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 @@ -110,7 +110,7 @@ public class Mantle { * @return the file */ public static File fileForRegion(File folder, Long key) { - File f = new File(folder, "p." + key + ".ttp.lz4"); + File f = new File(folder, "p." + key + ".ttp.lz4b"); if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } @@ -552,7 +552,7 @@ public class Mantle { File file = fileForRegion(dataFolder, x, z); if (!file.exists()) - file = new File(dataFolder, file.getName().substring(".lz4".length())); + file = new File(dataFolder, file.getName().substring(".lz4b".length())); if (file.exists()) { try { diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index a93cb9c4d..87d049b36 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -27,6 +27,7 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; import net.jpountz.lz4.LZ4BlockInputStream; +import net.jpountz.lz4.LZ4BlockOutputStream; import net.jpountz.lz4.LZ4FrameInputStream; import net.jpountz.lz4.LZ4FrameOutputStream; @@ -87,7 +88,7 @@ public class TectonicPlate { GZIPInputStream gzi = new GZIPInputStream(fin); din = new DataInputStream(gzi); } else { - LZ4FrameInputStream lz4 = new LZ4FrameInputStream(fin); + LZ4BlockInputStream lz4 = new LZ4BlockInputStream(fin); din = new DataInputStream(lz4); } TectonicPlate p = new TectonicPlate(worldHeight, din); @@ -178,7 +179,7 @@ public class TectonicPlate { GZIPOutputStream gzo = new GZIPOutputStream(fos); dos = new DataOutputStream(gzo); } else { - LZ4FrameOutputStream lz4 = new LZ4FrameOutputStream(fos); + LZ4BlockOutputStream lz4 = new LZ4BlockOutputStream(fos); dos = new DataOutputStream(lz4); } write(dos); From 5127b7c95933a40993b9332854456107db42a761 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 22 Dec 2023 16:16:48 +0100 Subject: [PATCH 58/66] - Added DiskSpace to Splash - Changed form ofSize to contain a space --- core/src/main/java/com/volmit/iris/Iris.java | 2 ++ .../main/java/com/volmit/iris/util/format/Form.java | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 020756d42..535c01120 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -788,6 +788,7 @@ public class Iris extends VolmitPlugin implements Listener { padd + C.GRAY + " " + C.DARK_GRAY + "@@@" + C.GRAY + "@@@@@@@@@@@@@@" }; String[] splash; + File freeSpace = new File(Bukkit.getWorldContainer() + "."); if (unstablemode) { splash = splashunstable; } else if (warningmode) { @@ -835,6 +836,7 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Process Threads: " + getCPUThreads()); Iris.info("Process Memory: " + getHardware.getProcessMemory() + " MB"); + Iris.info("Free DiskSpace: " + Form.ofSize(freeSpace.getFreeSpace(), 1024)); if (getHardware.getProcessMemory() < 5999) { Iris.warn("6GB+ Ram is recommended"); } diff --git a/core/src/main/java/com/volmit/iris/util/format/Form.java b/core/src/main/java/com/volmit/iris/util/format/Form.java index a38867767..bb2e7ec27 100644 --- a/core/src/main/java/com/volmit/iris/util/format/Form.java +++ b/core/src/main/java/com/volmit/iris/util/format/Form.java @@ -683,23 +683,23 @@ public class Form { */ public static String ofSize(long s, int div) { double d = (double) s; - String sub = "Bytes"; + String sub = " Bytes"; if (d > div - 1) { d /= div; - sub = "KB"; + sub = " KB"; if (d > div - 1) { d /= div; - sub = "MB"; + sub = " MB"; if (d > div - 1) { d /= div; - sub = "GB"; + sub = " GB"; if (d > div - 1) { d /= div; - sub = "TB"; + sub = " TB"; } } } From 3f3f947f43962f8e3555e793eb4c6db9c56ac8fb Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 16:17:56 +0100 Subject: [PATCH 59/66] change the Param description --- .../com/volmit/iris/core/commands/CommandDeveloper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 54450af8d..85e6f1644 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -85,9 +85,9 @@ public class CommandDeveloper implements DecreeExecutor { @Decree(description = "Test the compression algorithms") public void compression( - @Param(description = "World") World world, - @Param(description = "File") String path, - @Param(description = "Algorithm") String algorithm, + @Param(description = "base IrisWorld") World world, + @Param(description = "raw TectonicPlate File") String path, + @Param(description = "Algorithm to Test") String algorithm, @Param(description = "Amount of Tests") int amount) { if (!IrisToolbelt.isIrisWorld(world)) { sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList())); From 0546caeb056aacd19e99823fb769e92da53177c1 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 22 Dec 2023 16:24:48 +0100 Subject: [PATCH 60/66] - Fixed Process Threads displaying the incorrect value on startup. --- core/src/main/java/com/volmit/iris/Iris.java | 3 +-- .../src/main/java/com/volmit/iris/util/misc/getHardware.java | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 535c01120..578f71fb5 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -98,7 +98,6 @@ import java.util.Map; import static com.volmit.iris.core.safeguard.IrisSafeguard.*; import static com.volmit.iris.core.safeguard.ServerBootSFG.passedserversoftware; import static com.volmit.iris.util.misc.getHardware.getCPUModel; -import static com.volmit.iris.util.misc.getHardware.getCPUThreads; @SuppressWarnings("CanBeFinal") public class Iris extends VolmitPlugin implements Listener { @@ -834,7 +833,7 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Server Cpu: " + C.DARK_RED + "Failed"); } - Iris.info("Process Threads: " + getCPUThreads()); + Iris.info("Process Threads: " + Runtime.getRuntime().availableProcessors()); Iris.info("Process Memory: " + getHardware.getProcessMemory() + " MB"); Iris.info("Free DiskSpace: " + Form.ofSize(freeSpace.getFreeSpace(), 1024)); if (getHardware.getProcessMemory() < 5999) { diff --git a/core/src/main/java/com/volmit/iris/util/misc/getHardware.java b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java index 80221590d..0b9a52033 100644 --- a/core/src/main/java/com/volmit/iris/util/misc/getHardware.java +++ b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java @@ -13,11 +13,6 @@ public class getHardware { OperatingSystem os = systemInfo.getOperatingSystem(); return os.toString(); } - public static int getCPUThreads(){ - SystemInfo systemInfo = new SystemInfo(); - CentralProcessor processor = systemInfo.getHardware().getProcessor(); - return processor.getLogicalProcessorCount(); - } public static long getProcessMemory(){ long maxMemory = Runtime.getRuntime().maxMemory() / (1024 * 1024); return maxMemory; From ee4eb7b3f064b68ea25de31409e55eca63ec6772 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 16:34:39 +0100 Subject: [PATCH 61/66] fix --- .../main/java/com/volmit/iris/util/mantle/TectonicPlate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java index f58380445..b8e854c7d 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/TectonicPlate.java @@ -175,7 +175,7 @@ public class TectonicPlate { PrecisionStopwatch p = PrecisionStopwatch.start(); FileOutputStream fos = new FileOutputStream(file); DataOutputStream dos; - if (file.getName().endsWith("ttp.lz4")) { + if (file.getName().endsWith("ttp")) { GZIPOutputStream gzo = new GZIPOutputStream(fos); dos = new DataOutputStream(gzo); } else { From af8778c6cdf4464c5691764084cc87f13ca199ef Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 19:36:07 +0100 Subject: [PATCH 62/66] fix ArrayIndexOutOfBoundsException fix NullPointerException fix ConcurrentModificationException x2 --- .../iris/core/service/IrisEngineSVC.java | 33 ++++++++++++------- .../iris/util/hunk/bits/HashPalette.java | 33 ++++++++++++------- .../com/volmit/iris/util/mantle/Mantle.java | 15 +++++---- 3 files changed, 52 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index 2c80ecbaf..644d887e0 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -16,11 +16,13 @@ import org.bukkit.World; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; public class IrisEngineSVC implements IrisService { private static final AtomicInteger tectonicLimit = new AtomicInteger(30); - private final KMap cache = new KMap<>(); + private final ReentrantLock lastUseLock = new ReentrantLock(); + private final KMap lastUse = new KMap<>(); private Looper cacheTicker; private Looper trimTicker; private Looper unloadTicker; @@ -52,13 +54,18 @@ public class IrisEngineSVC implements IrisService { @Override protected long loop() { long now = System.currentTimeMillis(); - for (Engine key : cache.keySet()) { - Long last = cache.get(key); - if (last == null) - continue; - if (now - last > 600000) { // 10 minutes - cache.remove(key); + lastUseLock.lock(); + try { + for (Engine key : new ArrayList<>(lastUse.keySet())) { + Long last = lastUse.get(key); + if (last == null) + continue; + if (now - last > 60000) { // 1 minute + lastUse.remove(key); + } } + } finally { + lastUseLock.unlock(); } return 1000; } @@ -71,14 +78,14 @@ public class IrisEngineSVC implements IrisService { try { Engine engine = supplier.get(); if (engine != null) { - engine.getMantle().trim(tectonicLimit.get() / cache.size()); + engine.getMantle().trim(tectonicLimit.get() / lastUse.size()); } } catch (Throwable e) { Iris.reportError(e); return -1; } - int size = cache.size(); + int size = lastUse.size(); long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); if (time <= 0) return 0; @@ -106,7 +113,7 @@ public class IrisEngineSVC implements IrisService { return -1; } - int size = cache.size(); + int size = lastUse.size(); long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); if (time <= 0) return 0; @@ -132,7 +139,9 @@ public class IrisEngineSVC implements IrisService { if (generator != null) { Engine engine = generator.getEngine(); if (engine != null) { - cache.put(engine, System.currentTimeMillis()); + lastUseLock.lock(); + lastUse.put(engine, System.currentTimeMillis()); + lastUseLock.unlock(); return engine; } } @@ -149,6 +158,6 @@ public class IrisEngineSVC implements IrisService { cacheTicker.interrupt(); trimTicker.interrupt(); unloadTicker.interrupt(); - cache.clear(); + lastUse.clear(); } } diff --git a/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java b/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java index 2afc2c696..c35c02acc 100644 --- a/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java +++ b/core/src/main/java/com/volmit/iris/util/hunk/bits/HashPalette.java @@ -23,8 +23,10 @@ import com.volmit.iris.util.function.Consumer2; import java.util.LinkedHashMap; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; public class HashPalette implements Palette { + private final ReentrantLock lock = new ReentrantLock(); private final LinkedHashMap palette; private final KMap lookup; private final AtomicInteger size; @@ -47,14 +49,18 @@ public class HashPalette implements Palette { @Override public int add(T t) { - int index = size.getAndIncrement(); - palette.put(t, index); + lock.lock(); + try { + int index = size.getAndIncrement(); + palette.put(t, index); - if (t != null) { - lookup.put(index, t); + if (t != null) { + lookup.put(index, t); + } + return index; + } finally { + lock.unlock(); } - - return index; } @Override @@ -74,12 +80,17 @@ public class HashPalette implements Palette { @Override public void iterate(Consumer2 c) { - for (T i : palette.keySet()) { - if (i == null) { - continue; - } + lock.lock(); + try { + for (T i : palette.keySet()) { + if (i == null) { + continue; + } - c.accept(i, id(i)); + c.accept(i, id(i)); + } + } finally { + lock.unlock(); } } } 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 7b101cd2f..d4c04a189 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 @@ -50,6 +50,7 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantLock; /** * The mantle can store any type of data slice anywhere and manage regions & IO on it's own. @@ -396,8 +397,9 @@ public class Mantle { private final AtomicInteger forceAggressiveThreshold = new AtomicInteger(30); @Getter private final AtomicLong oldestTectonicPlate = new AtomicLong(0); + private final ReentrantLock unloadLock = new ReentrantLock(); @Getter - private Set toUnload = new HashSet<>(); + private final Set toUnload = new HashSet<>(); /** * Save & unload regions that have not been used for more than the @@ -421,6 +423,7 @@ public class Mantle { } ioTrim.set(true); + unloadLock.lock(); try { Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); if (lastUse != null) { @@ -438,14 +441,13 @@ public class Mantle { } finally { ioTrim.set(false); + unloadLock.unlock(); } } public int unloadTectonicPlate() { AtomicInteger i = new AtomicInteger(); - Set toUnload = this.toUnload; - this.toUnload = new HashSet<>(); - toUnload.removeIf(Objects::isNull); + unloadLock.lock(); try { List> futures = new ArrayList<>(); ExecutorService service = Executors.newFixedThreadPool(dynamicThreads.get()); @@ -471,15 +473,16 @@ public class Mantle { try { while (!futures.isEmpty()) { futures.remove(0).get(); + futures.removeIf(Future::isDone); } service.shutdown(); } catch (InterruptedException ignored) {} } catch (Exception e) { e.printStackTrace(); } finally { - this.toUnload.addAll(toUnload); + unloadLock.unlock(); + ioTectonicUnload.set(true); } - ioTectonicUnload.set(true); return i.get(); } From 5ed5322fce2947c4b62a6f943dbe89f887f66917 Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Fri, 22 Dec 2023 21:23:01 +0100 Subject: [PATCH 63/66] implement showing location instead of teleporting --- .../iris/core/commands/CommandFind.java | 30 ++++++++++++------- .../volmit/iris/engine/framework/Engine.java | 22 +++++++------- .../volmit/iris/engine/framework/Locator.java | 28 ++++++++++++----- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java b/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java index a85728803..d0bd97c68 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandFind.java @@ -34,7 +34,9 @@ public class CommandFind implements DecreeExecutor { @Decree(description = "Find a biome") public void biome( @Param(description = "The biome to look for") - IrisBiome biome + IrisBiome biome, + @Param(description = "Should you be teleported", defaultValue = "true") + boolean teleport ) { Engine e = engine(); @@ -43,13 +45,15 @@ public class CommandFind implements DecreeExecutor { return; } - e.gotoBiome(biome, player()); + e.gotoBiome(biome, player(), teleport); } @Decree(description = "Find a region") public void region( @Param(description = "The region to look for") - IrisRegion region + IrisRegion region, + @Param(description = "Should you be teleported", defaultValue = "true") + boolean teleport ) { Engine e = engine(); @@ -58,13 +62,15 @@ public class CommandFind implements DecreeExecutor { return; } - e.gotoRegion(region, player()); + e.gotoRegion(region, player(), teleport); } @Decree(description = "Find a structure") public void structure( @Param(description = "The structure to look for") - IrisJigsawStructure structure + IrisJigsawStructure structure, + @Param(description = "Should you be teleported", defaultValue = "true") + boolean teleport ) { Engine e = engine(); @@ -73,13 +79,15 @@ public class CommandFind implements DecreeExecutor { return; } - e.gotoJigsaw(structure, player()); + e.gotoJigsaw(structure, player(), teleport); } @Decree(description = "Find a point of interest.") public void poi( @Param(description = "The type of PoI to look for.") - String type + String type, + @Param(description = "Should you be teleported", defaultValue = "true") + boolean teleport ) { Engine e = engine(); if (e == null) { @@ -87,13 +95,15 @@ public class CommandFind implements DecreeExecutor { return; } - e.gotoPOI(type, player()); + e.gotoPOI(type, player(), teleport); } @Decree(description = "Find an object") public void object( @Param(description = "The object to look for", customHandler = ObjectHandler.class) - String object + String object, + @Param(description = "Should you be teleported", defaultValue = "true") + boolean teleport ) { Engine e = engine(); @@ -102,6 +112,6 @@ public class CommandFind implements DecreeExecutor { return; } - e.gotoObject(object, player()); + e.gotoObject(object, player(), teleport); } } diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 31bba630e..4d57cdf83 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -804,7 +804,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat return getBiomeOrMantle(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } - default void gotoBiome(IrisBiome biome, Player player) { + default void gotoBiome(IrisBiome biome, Player player, boolean teleport) { Set regionKeys = getDimension() .getAllRegions(this).stream() .filter((i) -> i.getAllBiomes(this).contains(biome)) @@ -816,13 +816,13 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat && lb.matches(engine, chunk); if (!regionKeys.isEmpty()) { - locator.find(player); + locator.find(player, teleport, "Biome " + biome.getName()); } else { player.sendMessage(C.RED + biome.getName() + " is not in any defined regions!"); } } - default void gotoJigsaw(IrisJigsawStructure s, Player player) { + default void gotoJigsaw(IrisJigsawStructure s, Player player, boolean teleport) { if (s.getLoadKey().equals(getDimension().getStronghold())) { KList p = getDimension().getStrongholds(getSeedManager().getSpawn()); @@ -859,7 +859,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat if (getDimension().getJigsawStructures().stream() .map(IrisJigsawStructurePlacement::getStructure) .collect(Collectors.toSet()).contains(s.getLoadKey())) { - Locator.jigsawStructure(s.getLoadKey()).find(player); + Locator.jigsawStructure(s.getLoadKey()).find(player, teleport, "Structure " + s.getLoadKey()); } else { Set biomeKeys = getDimension().getAllBiomes(this).stream() .filter((i) -> i.getJigsawStructures() @@ -886,7 +886,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat }; if (!regionKeys.isEmpty()) { - locator.find(player); + locator.find(player, teleport, "Structure " + s.getLoadKey()); } else { player.sendMessage(C.RED + s.getLoadKey() + " is not in any defined regions, biomes or dimensions!"); } @@ -894,7 +894,7 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat } - default void gotoObject(String s, Player player) { + default void gotoObject(String s, Player player, boolean teleport) { Set biomeKeys = getDimension().getAllBiomes(this).stream() .filter((i) -> i.getObjects().stream().anyMatch((f) -> f.getPlace().contains(s))) .map(IrisRegistrant::getLoadKey) @@ -917,23 +917,23 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat }; if (!regionKeys.isEmpty()) { - locator.find(player); + locator.find(player, teleport, "Object " + s); } else { player.sendMessage(C.RED + s + " is not in any defined regions or biomes!"); } } - default void gotoRegion(IrisRegion r, Player player) { + default void gotoRegion(IrisRegion r, Player player, boolean teleport) { if (!getDimension().getAllRegions(this).contains(r)) { player.sendMessage(C.RED + r.getName() + " is not defined in the dimension!"); return; } - Locator.region(r.getLoadKey()).find(player); + Locator.region(r.getLoadKey()).find(player, teleport, "Region " + r.getName()); } - default void gotoPOI(String type, Player p) { - Locator.poi(type).find(p); + default void gotoPOI(String type, Player p, boolean teleport) { + Locator.poi(type).find(p, teleport, "POI " + type); } default void cleanupMantleChunk(int x, int z) { diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Locator.java b/core/src/main/java/com/volmit/iris/engine/framework/Locator.java index 8dc597605..0c05c068b 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Locator.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Locator.java @@ -27,6 +27,7 @@ import com.volmit.iris.engine.object.IrisJigsawStructure; import com.volmit.iris.engine.object.IrisObject; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.util.context.ChunkContext; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; @@ -39,6 +40,7 @@ import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import com.volmit.iris.util.scheduling.jobs.SingleJob; import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; import java.util.Set; @@ -109,23 +111,35 @@ public interface Locator { boolean matches(Engine engine, Position2 chunk); - default void find(Player player) { - find(player, 30_000); + default void find(Player player, boolean teleport, String message) { + find(player, location -> { + if (teleport) { + J.s(() -> player.teleport(location)); + } else { + player.sendMessage(C.GREEN + message + " at: " + location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ()); + } + }); } - default void find(Player player, long timeout) { + default void find(Player player, Consumer consumer) { + find(player, 30_000, consumer); + } + + default void find(Player player, long timeout, Consumer consumer) { AtomicLong checks = new AtomicLong(); long ms = M.ms(); new SingleJob("Searching", () -> { try { - Position2 at = find(IrisToolbelt.access(player.getWorld()).getEngine(), new Position2(player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4), timeout, checks::set).get(); + World world = player.getWorld(); + Engine engine = IrisToolbelt.access(world).getEngine(); + Position2 at = find(engine, new Position2(player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4), timeout, checks::set).get(); if (at != null) { - J.s(() -> player.teleport(new Location(player.getWorld(), (at.getX() << 4) + 8, - IrisToolbelt.access(player.getWorld()).getEngine().getHeight( + consumer.accept(new Location(world, (at.getX() << 4) + 8, + engine.getHeight( (at.getX() << 4) + 8, (at.getZ() << 4) + 8, false), - (at.getZ() << 4) + 8))); + (at.getZ() << 4) + 8)); } } catch (WrongEngineBroException | InterruptedException | ExecutionException e) { e.printStackTrace(); From d73c2a65aeeca2326683a3e3c25b07167198dd3c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 23 Dec 2023 14:56:12 +0100 Subject: [PATCH 64/66] - Saving iris and mc version data to engine --- .../volmit/iris/core/tools/IrisCreator.java | 4 +- .../com/volmit/iris/engine/IrisEngine.java | 41 ++++++++++++++++++- .../engine/object/IrisEngineStatistics.java | 35 +++++++--------- 3 files changed, 57 insertions(+), 23 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java index f9cb549c0..7e6285d07 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java @@ -24,6 +24,7 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.ServerConfigurator; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.service.StudioSVC; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.platform.PlatformChunkGenerator; import com.volmit.iris.core.safeguard.UtilsSFG; @@ -45,6 +46,8 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; @@ -173,7 +176,6 @@ public class IrisCreator { } } } - //if (benchmark){loaded = true;} }); diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index d1eea7cc3..1f70e8d54 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -52,6 +52,7 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -64,6 +65,8 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Data @EqualsAndHashCode(exclude = "context") @@ -254,7 +257,10 @@ public class IrisEngine implements Engine { if (!f.exists()) { try { f.getParentFile().mkdirs(); - IO.writeAll(f, new Gson().toJson(new IrisEngineData())); + IrisEngineData data = new IrisEngineData(); + data.getStatistics().setVersion(getIrisVersion()); + data.getStatistics().setMCVersion(getMCVersion()); + IO.writeAll(f, new Gson().toJson(data)); } catch (IOException e) { e.printStackTrace(); } @@ -521,4 +527,37 @@ public class IrisEngine implements Engine { public int getCacheID() { return cacheId; } + + private int getIrisVersion() { + String input = Iris.instance.getDescription().getVersion(); + int hyphenIndex = input.indexOf('-'); + if (hyphenIndex != -1) { + String result = input.substring(0, hyphenIndex); + result = result.replaceAll("\\.", ""); + return Integer.parseInt(result); + } + Iris.error("Failed to assign a Iris Version"); + return 0; + } + + private int getMCVersion() { + try { + String version = Bukkit.getVersion(); + Matcher matcher = Pattern.compile("\\(MC: ([\\d.]+)\\)").matcher(version); + if (matcher.find()) { + version = matcher.group(1).replaceAll("\\.", ""); + long versionNumber = Long.parseLong(version); + if (versionNumber > Integer.MAX_VALUE) { + return -1; + } + return (int) versionNumber; + } + Iris.error("Failed to assign a Minecraft Version"); + return -1; + } catch (Exception e) { + Iris.error("Failed to assign a Minecraft Version"); + return -1; + } + } + } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java index f41a9b5c4..552f27466 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEngineStatistics.java @@ -29,35 +29,28 @@ import java.util.regex.Pattern; public class IrisEngineStatistics { private int totalHotloads = 0; private int chunksGenerated = 0; - private String IrisCreationVersion = getVersion(); - private String MinecraftVersion = getMCVersion(); + private int IrisCreationVersion = 0; + private int MinecraftVersion = 0; public void generatedChunk() { chunksGenerated++; } - public String getVersion() { - String input = Iris.instance.getDescription().getVersion(); - int hyphenIndex = input.indexOf('-'); - - String result = null; - if (hyphenIndex != -1) { - result = input.substring(0, hyphenIndex); - } - return result; + public void setVersion(int i) { + IrisCreationVersion = i; } - public String getMCVersion() { - String bukkitVersion = "git-Purpur-2023 (MC: 1.20.1)"; - Pattern pattern = Pattern.compile("\\(MC: (\\d+\\.\\d+(\\.\\d+)?)\\)"); - Matcher matcher = pattern.matcher(bukkitVersion); - - if (matcher.find()) { - return matcher.group(1); - } else { - return "ERROR"; // todo: Maybe do something ? - } + public void setMCVersion(int i) { + MinecraftVersion = i; } + public int getMCVersion() { + return MinecraftVersion; + } + public int getVersion() { + return MinecraftVersion; + } + + public void hotloaded() { From ca78200c1cda285a74496689cc783b40f6d808ba Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 23 Dec 2023 15:01:27 +0100 Subject: [PATCH 65/66] Deleted leftovers --- .../volmit/iris/util/SFG/WorldHandlerSFG.java | 179 ------------------ 1 file changed, 179 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java diff --git a/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java b/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java deleted file mode 100644 index 8ff552d27..000000000 --- a/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.volmit.iris.util.SFG; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.loader.IrisData; -import com.volmit.iris.core.service.StudioSVC; -import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.engine.object.IrisWorld; -import com.volmit.iris.engine.platform.BukkitChunkGenerator; -import com.volmit.iris.engine.platform.DummyChunkGenerator; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.plugin.VolmitSender; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.WorldCreator; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.generator.ChunkGenerator; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Objects; - -import static com.volmit.iris.Iris.service; - -public class WorldHandlerSFG { - static String WorldToLoad; - static String WorldEngine; - static String worldNameToCheck = "YourWorldName"; - private static VolmitSender sender; - public static void LoadWorld(String selectedWorld){ - if(Objects.equals(selectedWorld, "Benchmark")){ - return; - } - worldNameToCheck = selectedWorld; - boolean worldExists = doesWorldExist(worldNameToCheck); - WorldEngine = selectedWorld; - - if (!worldExists) { - return; - } - WorldToLoad = selectedWorld; - File BUKKIT_YML = new File("bukkit.yml"); - String pathtodim = selectedWorld + "\\iris\\pack\\dimensions\\"; - File directory = new File(Bukkit.getWorldContainer(), pathtodim); - - String dimension = null; - if (directory.exists() && directory.isDirectory()) { - File[] files = directory.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile()) { - String fileName = file.getName(); - if (fileName.endsWith(".json")) { - dimension = fileName.substring(0, fileName.length() - 5); - } - } - } - } - } else { - return; - } - - YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML); - String gen = "Iris:" + dimension; - ConfigurationSection section = yml.contains("worlds") ? yml.getConfigurationSection("worlds") : yml.createSection("worlds"); - if (!section.contains(selectedWorld)) { - section.createSection(selectedWorld).set("generator", gen); - try { - yml.save(BUKKIT_YML); - Iris.info("Registered \"" + selectedWorld + "\" in bukkit.yml"); - } catch (IOException e) { - Iris.error("Failed to update bukkit.yml!"); - e.printStackTrace(); - } - } - checkForBukkitWorlds(); - } - static boolean doesWorldExist(String worldName) { - File worldContainer = Bukkit.getWorldContainer(); - File worldDirectory = new File(worldContainer, worldName); - return worldDirectory.exists() && worldDirectory.isDirectory(); - } - private static void checkForBukkitWorlds() { - FileConfiguration fc = new YamlConfiguration(); - try { - fc.load(new File("bukkit.yml")); - ConfigurationSection section = fc.getConfigurationSection("worlds"); - if (section == null) { - return; - } - - List worldsToLoad = Collections.singletonList(WorldToLoad); - - for (String s : section.getKeys(false)) { - if (!worldsToLoad.contains(s)) { - continue; - } - ConfigurationSection entry = section.getConfigurationSection(s); - if (!entry.contains("generator", true)) { - continue; - } - String generator = entry.getString("generator"); - if (generator.startsWith("Iris:")) { - generator = generator.split("\\Q:\\E")[1]; - } else if (generator.equalsIgnoreCase("Iris")) { - generator = IrisSettings.get().getGenerator().getDefaultWorldType(); - } else { - continue; - } - Iris.info("2 World: %s | Generator: %s", s, generator); - if (Bukkit.getWorlds().stream().anyMatch(w -> w.getName().equals(s))) { - continue; - } - Iris.info(C.LIGHT_PURPLE + "Preparing Spawn for " + s + "' using Iris:" + generator + "..."); - new WorldCreator(s) - .generator(getDefaultWorldGenerator(s, generator)) - .environment(IrisData.loadAnyDimension(generator).getEnvironment()) - .createWorld(); - Iris.info(C.LIGHT_PURPLE + "Loaded " + s + "!"); - } - } catch (Throwable e) { - e.printStackTrace(); - } - } - public static ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { - Iris.debug("Default World Generator Called for " + worldName + " using ID: " + id); - if (worldName.equals("test")) { - try { - throw new RuntimeException(); - } catch (Throwable e) { - Iris.info(e.getStackTrace()[1].getClassName()); - if (e.getStackTrace()[1].getClassName().contains("com.onarandombox.MultiverseCore")) { - Iris.debug("MVC Test detected, Quick! Send them the dummy!"); - return new DummyChunkGenerator(); - } - } - } - IrisDimension dim; - if (id == null || id.isEmpty()) { - dim = IrisData.loadAnyDimension(IrisSettings.get().getGenerator().getDefaultWorldType()); - } else { - dim = IrisData.loadAnyDimension(id); - } - Iris.debug("Generator ID: " + id + " requested by bukkit/plugin"); - - if (dim == null) { - Iris.warn("Unable to find dimension type " + id + " Looking for online packs..."); - - service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender()), id, true); - dim = IrisData.loadAnyDimension(id); - - if (dim == null) { - throw new RuntimeException("Can't find dimension " + id + "!"); - } else { - Iris.info("Resolved missing dimension, proceeding with generation."); - } - } - Iris.debug("Assuming IrisDimension: " + dim.getName()); - IrisWorld w = IrisWorld.builder() - .name(worldName) - .seed(1337) - .environment(dim.getEnvironment()) - .worldFolder(new File(Bukkit.getWorldContainer(), worldName)) - .minHeight(dim.getMinHeight()) - .maxHeight(dim.getMaxHeight()) - .build(); - Iris.debug("Generator Config: " + w.toString()); - File ff = new File(w.worldFolder(), "iris/pack"); - if (!ff.exists() || ff.listFiles().length == 0) { - ff.mkdirs(); - service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile()); - } - return new BukkitChunkGenerator(w, false, ff, dim.getLoadKey()); - } -} From 6edf083e7bdc0cb9daf988134f558e3694ccef7a Mon Sep 17 00:00:00 2001 From: CrazyDev22 Date: Sat, 23 Dec 2023 20:39:54 +0100 Subject: [PATCH 66/66] fix /iris/iris/pack path --- core/src/main/java/com/volmit/iris/Iris.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 578f71fb5..7c21da0a0 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -725,7 +725,7 @@ public class Iris extends VolmitPlugin implements Listener { File ff = new File(w.worldFolder(), "iris/pack"); if (!ff.exists() || ff.listFiles().length == 0) { ff.mkdirs(); - service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile()); + service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), w.worldFolder()); } return new BukkitChunkGenerator(w, false, ff, dim.getLoadKey());