diff --git a/core/src/main/java/art/arcane/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/art/arcane/iris/core/pregenerator/IrisPregenerator.java index 5a94fa9fd..341328fe2 100644 --- a/core/src/main/java/art/arcane/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/art/arcane/iris/core/pregenerator/IrisPregenerator.java @@ -284,7 +284,6 @@ public class IrisPregenerator { Mantle mantle = getMantle(); if (mantle != null) { mantle.trim(0, 0); - mantle.unloadTectonicPlate(0); } } diff --git a/core/src/main/java/art/arcane/iris/core/pregenerator/methods/AsyncPregenMethod.java b/core/src/main/java/art/arcane/iris/core/pregenerator/methods/AsyncPregenMethod.java index d5665e80f..2b34db5aa 100644 --- a/core/src/main/java/art/arcane/iris/core/pregenerator/methods/AsyncPregenMethod.java +++ b/core/src/main/java/art/arcane/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -91,8 +91,6 @@ public class AsyncPregenMethod implements PregeneratorMethod { private final int maxResidentTectonicPlates; private final int mantleBackpressureWaitMs; private final long mantleBackpressureTimeoutMs; - private final long mantleReclaimIntervalMs; - private final AtomicLong lastMantleReclaim = new AtomicLong(0L); public AsyncPregenMethod(World world, int unusedThreads) { if (!PaperLib.isPaper()) { @@ -145,7 +143,6 @@ public class AsyncPregenMethod implements PregeneratorMethod { this.maxResidentTectonicPlates = pregen.getMaxResidentTectonicPlates(); this.mantleBackpressureWaitMs = pregen.getMantleBackpressureWaitMs(); this.mantleBackpressureTimeoutMs = pregen.getMantleBackpressureTimeoutMs(); - this.mantleReclaimIntervalMs = 1_000L; } private IrisPaperLikeBackendMode resolvePaperLikeBackendMode(IrisSettings.IrisSettingsPregen pregen) { @@ -501,31 +498,25 @@ public class AsyncPregenMethod implements PregeneratorMethod { return; } - long now = M.ms(); - long lastReclaimAt = lastMantleReclaim.get(); - if (now - lastReclaimAt >= mantleReclaimIntervalMs && lastMantleReclaim.compareAndSet(lastReclaimAt, now)) { - mantle.trim(0L, 0); - mantle.unloadTectonicPlate(0); - } - - if (mantle.getLoadedRegionCount() <= cap) { + int hardCap = cap * 2; + if (mantle.getLoadedRegionCount() <= hardCap) { return; } long waitStart = M.ms(); long lastLog = 0L; - while (mantle.getLoadedRegionCount() > cap) { + while (mantle.getLoadedRegionCount() > hardCap) { mantle.trim(0L, 0); int freed = mantle.unloadTectonicPlate(0); int resident = mantle.getLoadedRegionCount(); - if (resident <= cap) { + if (resident <= hardCap) { break; } long elapsed = M.ms() - waitStart; if (elapsed >= mantleBackpressureTimeoutMs) { Iris.warn("Pregen mantle backpressure exceeded " + mantleBackpressureTimeoutMs + "ms with " + resident - + " tectonic plates resident (cap " + cap + "); proceeding to avoid deadlock. " + + " tectonic plates resident (hard cap " + hardCap + "); proceeding to avoid deadlock. " + "Raise pregen.maxResidentTectonicPlates if this persists. " + metricsSnapshot()); return; } @@ -533,7 +524,7 @@ public class AsyncPregenMethod implements PregeneratorMethod { long logNow = M.ms(); if (logNow - lastLog >= 5_000L) { lastLog = logNow; - Iris.warn("Pregen mantle backpressure: " + resident + " tectonic plates resident (cap " + cap + Iris.warn("Pregen mantle backpressure: " + resident + " tectonic plates resident (hard cap " + hardCap + "), freed " + freed + " last pass, waited " + elapsed + "ms."); } diff --git a/core/src/main/java/art/arcane/iris/core/service/IrisEngineSVC.java b/core/src/main/java/art/arcane/iris/core/service/IrisEngineSVC.java index d566cbc41..c01f923db 100644 --- a/core/src/main/java/art/arcane/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/art/arcane/iris/core/service/IrisEngineSVC.java @@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicLong; public class IrisEngineSVC implements IrisService { private static final int TRIM_PERIOD = 2_000; - private static final long ACTIVE_PREGEN_IDLE_MILLIS = 500L; private final AtomicInteger tectonicLimit = new AtomicInteger(30); private final AtomicInteger tectonicPlates = new AtomicInteger(); private final AtomicInteger queuedTectonicPlates = new AtomicInteger(); @@ -188,7 +187,8 @@ public class IrisEngineSVC implements IrisService { } private void add(World world) { - var access = IrisToolbelt.access(world); + if (world == null || worlds.containsKey(world)) return; + PlatformChunkGenerator access = IrisToolbelt.access(world); if (access == null) return; worlds.put(world, new Registered(world.getName(), access)); } @@ -201,6 +201,10 @@ public class IrisEngineSVC implements IrisService { @Override protected long loop() { try { + for (World world : Bukkit.getWorlds()) { + add(world); + } + int queuedPlates = 0; int totalPlates = 0; long chunks = 0; @@ -372,15 +376,11 @@ public class IrisEngineSVC implements IrisService { return limit; } - return Math.max(1, Math.min(limit, Math.max(2, limit / 8))); + return Math.max(limit, IrisSettings.get().getPregen().getMaxResidentTectonicPlates()); } private long activeIdleDuration(Engine engine) { - if (!pregenTargets(engine)) { - return TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()); - } - - return ACTIVE_PREGEN_IDLE_MILLIS; + return TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getMantleKeepAlive()); } @Synchronized