From 29396b6235d1c92bb35fe96f82b3602778b2efb9 Mon Sep 17 00:00:00 2001 From: ichttt Date: Wed, 13 May 2020 00:11:45 +0200 Subject: [PATCH] Fix server config directory remaining locked when integrated server is shut down. (#6644) --- .../minecraftforge/common/ForgeConfigSpec.java | 2 +- .../fml/config/ConfigFileTypeHandler.java | 9 +++++++++ .../minecraftforge/fml/config/ConfigTracker.java | 16 +++++++++++++++- .../fml/server/ServerLifecycleHooks.java | 12 +++++++++--- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java index dc011d7c0c..dc94436721 100644 --- a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java +++ b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java @@ -81,7 +81,7 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper diff --git a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java index 4abf0577fb..3f08c9b3bc 100644 --- a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java +++ b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java @@ -62,6 +62,15 @@ public class ConfigFileTypeHandler { }; } + public void unload(Path configBasePath, ModConfig config) { + Path configPath = configBasePath.resolve(config.getFileName()); + try { + FileWatcher.defaultInstance().removeWatch(configBasePath.resolve(config.getFileName())); + } catch (RuntimeException e) { + LOGGER.error("Failed to remove config {} from tracker!", configPath.toString(), e); + } + } + private boolean setupConfigFile(final ModConfig modConfig, final Path file, final ConfigFormat conf) throws IOException { Path p = defaultConfigPath.resolve(modConfig.getFileName()); if (Files.exists(p)) { diff --git a/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java b/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java index 5a1836fc7c..e327353bb8 100644 --- a/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java +++ b/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java @@ -83,6 +83,11 @@ public class ConfigTracker { this.configSets.get(type).forEach(config -> openConfig(config, configBasePath)); } + public void unloadConfigs(ModConfig.Type type, Path configBasePath) { + LOGGER.debug(CONFIG, "Unloading configs type {}", type); + this.configSets.get(type).forEach(config -> closeConfig(config, configBasePath)); + } + public List> syncConfigs(boolean isLocal) { final Map configData = configSets.get(ModConfig.Type.SERVER).stream().collect(Collectors.toMap(ModConfig::getFileName, mc -> { //TODO: Test cpw's LambdaExceptionUtils on Oracle javac. try { @@ -95,13 +100,22 @@ public class ConfigTracker { } private void openConfig(final ModConfig config, final Path configBasePath) { - LOGGER.debug(CONFIG, "Loading config file type {} at {} for {}", config.getType(), config.getFileName(), config.getModId()); + LOGGER.trace(CONFIG, "Loading config file type {} at {} for {}", config.getType(), config.getFileName(), config.getModId()); final CommentedFileConfig configData = config.getHandler().reader(configBasePath).apply(config); config.setConfigData(configData); config.fireEvent(new ModConfig.Loading(config)); config.save(); } + private void closeConfig(final ModConfig config, final Path configBasePath) { + if (config.getConfigData() != null) { + LOGGER.trace(CONFIG, "Closing config file type {} at {} for {}", config.getType(), config.getFileName(), config.getModId()); + config.save(); + config.getHandler().unload(configBasePath, config); + config.setConfigData(null); + } + } + public void receiveSyncedConfig(final FMLHandshakeMessages.S2CConfigData s2CConfigData, final Supplier contextSupplier) { if (!Minecraft.getInstance().isIntegratedServerRunning()) { Optional.ofNullable(fileMap.get(s2CConfigData.getFileName())).ifPresent(mc-> { diff --git a/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java b/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java index 1b81fd4a7c..031efb409d 100644 --- a/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java +++ b/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java @@ -73,13 +73,18 @@ public class ServerLifecycleHooks private static volatile CountDownLatch exitLatch = null; private static MinecraftServer currentServer; + private static Path getServerConfigPath(final MinecraftServer server) + { + final Path serverConfig = server.getActiveAnvilConverter().getFile(server.getFolderName(), "serverconfig").toPath(); + FileUtils.getOrCreateDirectory(serverConfig, "serverconfig"); + return serverConfig; + } + public static boolean handleServerAboutToStart(final MinecraftServer server) { currentServer = server; LogicalSidedProvider.setServer(()->server); - final Path serverConfig = server.getActiveAnvilConverter().getFile(server.getFolderName(), "serverconfig").toPath(); - FileUtils.getOrCreateDirectory(serverConfig, "serverconfig"); - ConfigTracker.INSTANCE.loadConfigs(ModConfig.Type.SERVER, serverConfig); + ConfigTracker.INSTANCE.loadConfigs(ModConfig.Type.SERVER, getServerConfigPath(server)); ResourcePackLoader.loadResourcePacks(currentServer.getResourcePacks(), ServerLifecycleHooks::buildPackFinder); return !MinecraftForge.EVENT_BUS.post(new FMLServerAboutToStartEvent(server)); } @@ -120,6 +125,7 @@ public class ServerLifecycleHooks latch.countDown(); exitLatch = null; } + ConfigTracker.INSTANCE.unloadConfigs(ModConfig.Type.SERVER, getServerConfigPath(server)); } public static MinecraftServer getCurrentServer()