Fix server config directory remaining locked when integrated server is shut down. (#6644)

This commit is contained in:
ichttt 2020-05-13 00:11:45 +02:00 committed by GitHub
parent 4ce32c3663
commit 29396b6235
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 5 deletions

View File

@ -81,7 +81,7 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
public void setConfig(CommentedConfig config) {
this.childConfig = config;
if (!isCorrect(config)) {
if (config != null && !isCorrect(config)) {
String configName = config instanceof FileConfig ? ((FileConfig) config).getNioPath().toString() : config.toString();
LogManager.getLogger().warn(CORE, "Configuration file {} is not correct. Correcting", configName);
correct(config, (action, path, incorrectValue, correctedValue) ->

View File

@ -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)) {

View File

@ -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<Pair<String, FMLHandshakeMessages.S2CConfigData>> syncConfigs(boolean isLocal) {
final Map<String, byte[]> 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<NetworkEvent.Context> contextSupplier) {
if (!Minecraft.getInstance().isIntegratedServerRunning()) {
Optional.ofNullable(fileMap.get(s2CConfigData.getFileName())).ifPresent(mc-> {

View File

@ -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()