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