From 11ec8b1eaa0cab4da08e08e028cd3a152327e85d Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 18 Aug 2023 07:47:18 -0500 Subject: [PATCH] Fix Render data attempting to recreate files on setting change --- .../file/renderfile/RenderMetaDataFile.java | 18 ++++++++++++++++++ .../renderfile/RenderSourceFileHandler.java | 7 +++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderMetaDataFile.java b/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderMetaDataFile.java index e7dc376e9..7362e7df4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderMetaDataFile.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderMetaDataFile.java @@ -80,6 +80,24 @@ public class RenderMetaDataFile extends AbstractMetaDataContainerFile implements // constructor // //=============// + /** + * Can be used instead of {@link RenderMetaDataFile#createFromExistingFile} or {@link RenderMetaDataFile#createNewFileForPos}, + * if we are uncertain whether a file exists or not. + */ + public static RenderMetaDataFile createFromExistingOrNewFile(RenderSourceFileHandler fileHandler, DhSectionPos pos) throws IOException + { + File file = fileHandler.computeRenderFilePath(pos); + if (file.exists()) + { + return createFromExistingFile(fileHandler, file); + } + else + { + return createNewFileForPos(fileHandler, pos); + } + } + + /** * NOTE: should only be used if there is NOT an existing file. * diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderSourceFileHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderSourceFileHandler.java index 5f6e7feb1..8e3613e34 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderSourceFileHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/renderfile/RenderSourceFileHandler.java @@ -310,12 +310,11 @@ public class RenderSourceFileHandler implements ILodRenderSourceProvider return null; } - // File does not exist, create it. - // In this case, since 'creating' a file object doesn't actually do anything heavy on IO yet, we use CAS - // to avoid overhead of 'synchronized', and eat the mini-overhead of possibly creating duplicate objects. + // File probably doesn't exist, try creating it. try { - metaFile = RenderMetaDataFile.createNewFileForPos(this, pos); + // createFromExistingOrNewFile is due to a rare issue where the file may already exist but isn't in the file list + metaFile = RenderMetaDataFile.createFromExistingOrNewFile(this, pos); } catch (IOException e) {