From 82f71198e6a62909e1b4120b67afeb21d672401c Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Fri, 23 Aug 2024 23:13:23 +0200 Subject: [PATCH] add saving headless regions after x seconds --- .../com/volmit/iris/core/IrisSettings.java | 1 + .../iris/core/nms/v1_20_R3/Headless.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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 57c547568..c17c8f0a2 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -146,6 +146,7 @@ public class IrisSettings { public static class IrisSettingsPerformance { public boolean trimMantleInStudio = false; public int mantleKeepAlive = 30; + public int headlessKeepAlive = 10; public int cacheSize = 4_096; public int resourceLoaderCacheSize = 1_024; public int objectLoaderCacheSize = 4_096; diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java index 3796c2814..d171aa022 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.nms.v1_20_R3; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.ServerConfigurator; import com.volmit.iris.core.nms.IHeadless; import com.volmit.iris.core.nms.v1_20_R3.mca.MCATerrainChunk; @@ -39,9 +40,11 @@ import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder; import com.volmit.iris.util.hunk.view.SyncChunkDataHunkHolder; import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Looper; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -67,6 +70,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class Headless implements IHeadless, LevelHeightAccessor { + private final long KEEP_ALIVE = TimeUnit.SECONDS.toMillis(IrisSettings.get().getPerformance().getHeadlessKeepAlive()); private final NMSBinding binding; private final Engine engine; private final RegionFileStorage storage; @@ -102,6 +106,25 @@ public class Headless implements IHeadless, LevelHeightAccessor { minecraftBiomes.put(biome, binding.getBiomeHolder(biome.getKey())); } ServerConfigurator.dumpDataPack(); + startRegionCleaner(); + } + + private void startRegionCleaner() { + var cleaner = new Looper() { + @Override + protected long loop() { + if (closed) return -1; + long time = M.ms() - KEEP_ALIVE; + regions.values() + .stream() + .filter(r -> r.lastEntry < time) + .forEach(Region::submit); + return closed ? -1 : 1000; + } + }; + cleaner.setName("Iris Region Cleaner - " + engine.getWorld().name()); + cleaner.setPriority(Thread.MIN_PRIORITY); + cleaner.start(); } @Override @@ -282,6 +305,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { private final long key; private final KList chunks = new KList<>(1024); private final AtomicBoolean full = new AtomicBoolean(); + private long lastEntry = M.ms(); public Region(long key) { this.x = Cache.keyX(key); @@ -315,6 +339,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { public synchronized void add(ProtoChunk chunk) { chunks.add(chunk); + lastEntry = M.ms(); if (chunks.size() < 1024) return; submit();