diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataSourceProviderV2.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataSourceProviderV2.java index ac30b3249..7a8a7cf57 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataSourceProviderV2.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/FullDataSourceProviderV2.java @@ -81,7 +81,7 @@ public class FullDataSourceProviderV2 * vs gracefully shutting down the thread ourselves. */ protected final AtomicBoolean migrationThreadRunning = new AtomicBoolean(true); - protected final FullDataSourceProviderV1 legacyFileHandler; + protected final FullDataSourceProviderV1 legacyFileHandler; /** * Tracks which positions are currently being updated @@ -106,7 +106,7 @@ public class FullDataSourceProviderV2 public FullDataSourceProviderV2(IDhLevel level, AbstractSaveStructure saveStructure, @Nullable File saveDirOverride) { super(level, saveStructure, saveDirOverride); - this.legacyFileHandler = new FullDataSourceProviderV1(level, saveStructure, saveDirOverride); + this.legacyFileHandler = new FullDataSourceProviderV1<>(level, saveStructure, saveDirOverride); DebugRenderer.register(this, Config.Client.Advanced.Debugging.DebugWireframe.showFullDataUpdateStatus); @@ -492,6 +492,8 @@ public class FullDataSourceProviderV2 super.close(); this.updateQueueProcessor.shutdownNow(); + this.legacyFileHandler.close(); + this.migrationThreadRunning.set(false); this.migrationThreadPool.shutdown(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java index 31fcd1158..801a2a256 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ClientLevelModule.java @@ -41,6 +41,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrap import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import org.apache.logging.log4j.Logger; +import javax.annotation.WillNotClose; import java.io.Closeable; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; @@ -54,6 +55,7 @@ public class ClientLevelModule implements Closeable, AbstractNewDataSourceHandle private final IDhClientLevel clientLevel; + @WillNotClose public final FullDataSourceProviderV2 fullDataSourceProvider; public final AtomicReference ClientRenderStateRef = new AtomicReference<>(); @@ -111,7 +113,7 @@ public class ClientLevelModule implements Closeable, AbstractNewDataSourceHandle } clientRenderState.close(); - clientRenderState = new ClientRenderState(this.clientLevel, clientLevelWrapper, this.clientLevel.getFullDataProvider(), this.clientLevel.getSaveStructure()); + clientRenderState = new ClientRenderState(this.clientLevel, clientLevelWrapper, this.clientLevel.getFullDataProvider()); if (!this.ClientRenderStateRef.compareAndSet(null, clientRenderState)) { //FIXME: How to handle this? @@ -144,7 +146,7 @@ public class ClientLevelModule implements Closeable, AbstractNewDataSourceHandle public boolean startRenderer(IClientLevelWrapper clientLevelWrapper) { // TODO why are we passing in a level wrapper? Our client level is already defined. - ClientRenderState ClientRenderState = new ClientRenderState(this.clientLevel, clientLevelWrapper, this.clientLevel.getFullDataProvider(), this.clientLevel.getSaveStructure()); + ClientRenderState ClientRenderState = new ClientRenderState(this.clientLevel, clientLevelWrapper, this.clientLevel.getFullDataProvider()); if (!this.ClientRenderStateRef.compareAndSet(null, ClientRenderState)) { LOGGER.warn("Failed to start renderer due to concurrency"); @@ -324,9 +326,7 @@ public class ClientLevelModule implements Closeable, AbstractNewDataSourceHandle public final LodQuadTree quadtree; public final LodRenderer renderer; - public ClientRenderState( - IDhClientLevel dhClientLevel, IClientLevelWrapper clientLevelWrapper, FullDataSourceProviderV2 fullDataSourceProvider, - AbstractSaveStructure saveStructure) + public ClientRenderState(IDhClientLevel dhClientLevel, IClientLevelWrapper clientLevelWrapper, FullDataSourceProviderV2 fullDataSourceProvider) { this.clientLevelWrapper = clientLevelWrapper; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java index f3af49231..184bf20af 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java @@ -103,47 +103,37 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel //================// @Override - public int computeBaseColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) { return levelWrapper.computeBaseColor(pos, biome, block); } + public int computeBaseColor(DhBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) { return this.levelWrapper.computeBaseColor(pos, biome, block); } @Override - public IClientLevelWrapper getClientLevelWrapper() { return levelWrapper; } + public IClientLevelWrapper getClientLevelWrapper() { return this.levelWrapper; } @Override - public void clearRenderCache() - { - clientside.clearRenderCache(); - } + public void clearRenderCache() { this.clientside.clearRenderCache(); } @Override - public ILevelWrapper getLevelWrapper() { return levelWrapper; } + public ILevelWrapper getLevelWrapper() { return this.levelWrapper; } @Override public CompletableFuture updateDataSourcesAsync(FullDataSourceV2 data) { return this.clientside.updateDataSourcesAsync(data); } @Override - public int getMinY() { return levelWrapper.getMinHeight(); } + public int getMinY() { return this.levelWrapper.getMinHeight(); } @Override public void close() { - clientside.close(); + this.clientside.close(); super.close(); - dataFileHandler.close(); + this.dataFileHandler.close(); LOGGER.info("Closed " + DhClientLevel.class.getSimpleName() + " for " + levelWrapper); } - //=======================// - // misc helper functions // - //=======================// - @Override public FullDataSourceProviderV2 getFullDataProvider() { return this.dataFileHandler; } @Override - public AbstractSaveStructure getSaveStructure() - { - return saveStructure; - } + public AbstractSaveStructure getSaveStructure() { return this.saveStructure; } @Override public boolean hasSkyLight() { return this.levelWrapper.hasSkyLight(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java index 7da152d82..0527f61c9 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java @@ -23,14 +23,12 @@ import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhAp import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.file.fullDatafile.FullDataSourceProviderV2; -import com.seibel.distanthorizons.core.render.LodRenderSection; import com.seibel.distanthorizons.core.render.renderer.DebugRenderer; import com.seibel.distanthorizons.core.file.structure.AbstractSaveStructure; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; -import com.seibel.distanthorizons.core.util.objects.quadTree.QuadNode; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -41,7 +39,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapp import org.apache.logging.log4j.Logger; import java.awt.*; -import java.util.Iterator; import java.util.concurrent.CompletableFuture; /** The level used on a singleplayer world */ @@ -103,7 +100,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev // start world gen // create a new queue - this.serverside.worldGenModule.startWorldGen(this.serverside.dataFileHandler, new ServerLevelModule.WorldGenState(this)); + this.serverside.worldGenModule.startWorldGen(this.serverside.fullDataFileHandler, new ServerLevelModule.WorldGenState(this)); // TODO I think this used to queue the world gen // is it still needed? @@ -119,7 +116,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev else if (!shouldDoWorldGen && isWorldGenRunning) { // stop world gen - this.serverside.worldGenModule.stopWorldGen(this.serverside.dataFileHandler); + this.serverside.worldGenModule.stopWorldGen(this.serverside.fullDataFileHandler); } if (isWorldGenRunning) @@ -169,7 +166,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev public ILevelWrapper getLevelWrapper() { return getServerLevelWrapper(); } @Override - public FullDataSourceProviderV2 getFullDataProvider() { return this.serverside.dataFileHandler; } + public FullDataSourceProviderV2 getFullDataProvider() { return this.serverside.fullDataFileHandler; } @Override public AbstractSaveStructure getSaveStructure() diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java index 9af6fdc32..8b591258a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java @@ -72,12 +72,12 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel if (shouldDoWorldGen && !isWorldGenRunning) { // start world gen - serverside.worldGenModule.startWorldGen(serverside.dataFileHandler, new ServerLevelModule.WorldGenState(this)); + serverside.worldGenModule.startWorldGen(serverside.fullDataFileHandler, new ServerLevelModule.WorldGenState(this)); } else if (!shouldDoWorldGen && isWorldGenRunning) { // stop world gen - serverside.worldGenModule.stopWorldGen(serverside.dataFileHandler); + serverside.worldGenModule.stopWorldGen(serverside.fullDataFileHandler); } if (serverside.worldGenModule.isWorldGenRunning()) @@ -93,7 +93,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel public ILevelWrapper getLevelWrapper() { return getServerLevelWrapper(); } @Override - public FullDataSourceProviderV2 getFullDataProvider() { return this.serverside.dataFileHandler; } + public FullDataSourceProviderV2 getFullDataProvider() { return this.serverside.fullDataFileHandler; } @Override public AbstractSaveStructure getSaveStructure() diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java index 1deb4a4e4..57a7fedf4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java @@ -30,13 +30,13 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.coreapi.DependencyInjection.WorldGeneratorInjector; import org.apache.logging.log4j.Logger; -public class ServerLevelModule +public class ServerLevelModule implements AutoCloseable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); public final IDhServerLevel parentServerLevel; public final AbstractSaveStructure saveStructure; - public final GeneratedFullDataSourceProvider dataFileHandler; + public final GeneratedFullDataSourceProvider fullDataFileHandler; public final AppliedConfigState worldGeneratorEnabledConfig; public final WorldGenModule worldGenModule; @@ -47,18 +47,19 @@ public class ServerLevelModule { this.parentServerLevel = parentServerLevel; this.saveStructure = saveStructure; - this.dataFileHandler = new GeneratedFullDataSourceProvider(parentServerLevel, saveStructure); + this.fullDataFileHandler = new GeneratedFullDataSourceProvider(parentServerLevel, saveStructure); this.worldGeneratorEnabledConfig = new AppliedConfigState<>(Config.Client.Advanced.WorldGenerator.enableDistantGeneration); - this.worldGenModule = new WorldGenModule(this.dataFileHandler, this.parentServerLevel); + this.worldGenModule = new WorldGenModule(this.parentServerLevel); } + @Override public void close() { // shutdown the world-gen this.worldGenModule.close(); - this.dataFileHandler.close(); + this.fullDataFileHandler.close(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java index baab12724..07c9dd3b7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/WorldGenModule.java @@ -34,7 +34,6 @@ public class WorldGenModule implements Closeable { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); - private final GeneratedFullDataSourceProvider dataFileHandler; private final GeneratedFullDataSourceProvider.IOnWorldGenCompleteListener onWorldGenCompleteListener; private final AtomicReference worldGenStateRef = new AtomicReference<>(); @@ -42,9 +41,8 @@ public class WorldGenModule implements Closeable - public WorldGenModule(GeneratedFullDataSourceProvider dataFileHandler, GeneratedFullDataSourceProvider.IOnWorldGenCompleteListener onWorldGenCompleteListener) + public WorldGenModule(GeneratedFullDataSourceProvider.IOnWorldGenCompleteListener onWorldGenCompleteListener) { - this.dataFileHandler = dataFileHandler; this.onWorldGenCompleteListener = onWorldGenCompleteListener; this.worldGenF3Message = new F3Screen.DynamicMessage(() -> { @@ -138,7 +136,6 @@ public class WorldGenModule implements Closeable } } - this.dataFileHandler.close(); this.worldGenF3Message.close(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java index 245919657..6ade073f2 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java @@ -37,6 +37,7 @@ import com.seibel.distanthorizons.coreapi.util.MathUtil; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; +import javax.annotation.WillNotClose; import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; @@ -59,6 +60,7 @@ public class LodQuadTree extends QuadTree implements AutoClose public final int blockRenderDistanceDiameter; + @WillNotClose private final FullDataSourceProviderV2 fullDataSourceProvider; /** @@ -508,7 +510,7 @@ public class LodQuadTree extends QuadTree implements AutoClose break; } - renderSection.tryQueuingMissingLodRetrieval(this.fullDataSourceProvider); + renderSection.tryQueuingMissingLodRetrieval(); } // calculate an estimate for the max number of tasks for the queue diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java index 81346e1e2..2720fe020 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java @@ -37,6 +37,7 @@ import com.seibel.distanthorizons.core.util.TimerUtil; import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import org.apache.logging.log4j.Logger; +import javax.annotation.WillNotClose; import java.awt.*; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -68,6 +69,7 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable public final DhSectionPos pos; private final IDhClientLevel level; + @WillNotClose private final FullDataSourceProviderV2 fullDataSourceProvider; @@ -279,14 +281,14 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable public boolean missingPositionsCalculated() { return this.missingPositionsCalculated; } public int ungeneratedPositionCount() { return (this.missingGenerationPos != null) ? this.missingGenerationPos.size() : 0; } - public void tryQueuingMissingLodRetrieval(FullDataSourceProviderV2 fullDataSourceProvider) + public void tryQueuingMissingLodRetrieval() { - if (fullDataSourceProvider.canRetrieveMissingDataSources() && fullDataSourceProvider.canQueueRetrieval()) + if (this.fullDataSourceProvider.canRetrieveMissingDataSources() && this.fullDataSourceProvider.canQueueRetrieval()) { // calculate the missing positions if not already done if (!this.missingPositionsCalculated) { - this.missingGenerationPos = fullDataSourceProvider.getPositionsToRetrieve(this.pos); + this.missingGenerationPos = this.fullDataSourceProvider.getPositionsToRetrieve(this.pos); if (this.missingGenerationPos != null) { this.missingPositionsCalculated = true; @@ -299,14 +301,14 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable // queue from last to first to prevent shifting the array unnecessarily for (int i = this.missingGenerationPos.size() - 1; i >= 0; i--) { - if (!fullDataSourceProvider.canQueueRetrieval()) + if (!this.fullDataSourceProvider.canQueueRetrieval()) { // the data source provider isn't accepting any more jobs break; } DhSectionPos pos = this.missingGenerationPos.remove(i); - boolean positionQueued = fullDataSourceProvider.queuePositionForRetrieval(pos); + boolean positionQueued = this.fullDataSourceProvider.queuePositionForRetrieval(pos); if (!positionQueued) { // shouldn't normally happen, but just in case diff --git a/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/AbstractDhRepo.java b/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/AbstractDhRepo.java index aa45199f9..cdd059b59 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/AbstractDhRepo.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/sql/repo/AbstractDhRepo.java @@ -37,7 +37,7 @@ import java.util.concurrent.locks.ReentrantLock; * * @param DTO stands for "Data Transfer Object" */ -public abstract class AbstractDhRepo> +public abstract class AbstractDhRepo> implements AutoCloseable { public static final int TIMEOUT_SECONDS = 30; @@ -379,6 +379,7 @@ public abstract class AbstractDhRepo> } } + @Override public void close() { try @@ -391,9 +392,17 @@ public abstract class AbstractDhRepo> { if(this.connection != null) { - LOGGER.info("Closing database connection ["+this.connectionString+"]"); CONNECTIONS_BY_CONNECTION_STRING.remove(this.connectionString); - this.connection.close(); + + if (!this.connection.isClosed()) + { + LOGGER.info("Closing database connection: [" + this.connectionString + "]"); + this.connection.close(); + } + else + { + LOGGER.warn("Attempting to close already closed database connection: [" + this.connectionString + "]"); + } } ACTIVE_CONNECTION_STRINGS_BY_REPO.remove(this); }