diff options
6 files changed, 45 insertions, 37 deletions
diff --git a/config/src/main/java/com/yahoo/config/subscription/DirSource.java b/config/src/main/java/com/yahoo/config/subscription/DirSource.java index 5dfbd5f0bc4..87bf51af26f 100644 --- a/config/src/main/java/com/yahoo/config/subscription/DirSource.java +++ b/config/src/main/java/com/yahoo/config/subscription/DirSource.java @@ -15,8 +15,8 @@ public class DirSource implements ConfigSource { this.dir = dir; } - public File getDir() { - return dir; + public FileSource getFile(String name) { + return new FileSource(new File(dir, name)); } } diff --git a/config/src/main/java/com/yahoo/config/subscription/FileSource.java b/config/src/main/java/com/yahoo/config/subscription/FileSource.java index 2178c64cca3..9d3c6041f4b 100644 --- a/config/src/main/java/com/yahoo/config/subscription/FileSource.java +++ b/config/src/main/java/com/yahoo/config/subscription/FileSource.java @@ -2,23 +2,35 @@ package com.yahoo.config.subscription; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.List; /** * Source specifying config from one local file * * @author Vegard Havdal + * @author jonmv */ public class FileSource implements ConfigSource { private final File file; public FileSource(File file) { - if ( ! file.isFile()) throw new IllegalArgumentException("Not an ordinary file: "+file); this.file = file; + validateFile(); } - public File getFile() { - return file; + public long getLastModified() { + return file.lastModified(); + } + + public List<String> getContent() throws IOException { + return Files.readAllLines(file.toPath()); + } + + public void validateFile() { + if ( ! file.isFile()) throw new IllegalArgumentException("Not a file: " + file); } } diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java index c1a6740b6da..2c4e3d40250 100644 --- a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java +++ b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java @@ -142,8 +142,8 @@ public abstract class ConfigSubscription<T extends ConfigInstance> { } private static <T extends ConfigInstance> ConfigSubscription<T> getFileSub(ConfigKey<T> key, ConfigSource source) { - File file = source instanceof FileSource fileSource ? fileSource.getFile() - : new File(key.getConfigId().replace("file:", "")); + FileSource file = source instanceof FileSource fileSource ? fileSource + : new FileSource(new File(key.getConfigId().replace("file:", ""))); return new FileConfigSubscription<>(key, file); } @@ -155,8 +155,9 @@ public abstract class ConfigSubscription<T extends ConfigInstance> { } private static <T extends ConfigInstance> ConfigSubscription<T> getDirFileSub(ConfigKey<T> key, ConfigSource source) { - File dir = source instanceof DirSource dirSource ? dirSource.getDir() : new File(key.getConfigId().replace("dir:", "")); - return new FileConfigSubscription<>(key, new File(dir, getConfigFilename(key))); + DirSource dir = source instanceof DirSource dirSource ? dirSource + : new DirSource(new File(key.getConfigId().replace("dir:", ""))); + return new FileConfigSubscription<>(key, dir.getFile(getConfigFilename(key))); } @Override diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java index 47ac0dfbf85..216657a6db3 100644 --- a/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java +++ b/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java @@ -5,14 +5,11 @@ import com.yahoo.config.ConfigInstance; import com.yahoo.config.ConfigurationRuntimeException; import com.yahoo.config.subscription.CfgConfigPayloadBuilder; import com.yahoo.config.subscription.ConfigInterruptedException; -import com.yahoo.io.IOUtils; +import com.yahoo.config.subscription.FileSource; import com.yahoo.vespa.config.ConfigKey; import com.yahoo.vespa.config.ConfigPayload; -import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.util.Arrays; import static java.util.logging.Level.FINE; @@ -23,19 +20,19 @@ import static java.util.logging.Level.FINE; */ public class FileConfigSubscription<T extends ConfigInstance> extends ConfigSubscription<T> { - final File file; + final FileSource file; long ts; - FileConfigSubscription(ConfigKey<T> key, File f) { + FileConfigSubscription(ConfigKey<T> key, FileSource file) { super(key); + file.validateFile(); setGeneration(0L); - file = f; - if ( ! file.isFile()) throw new IllegalArgumentException("Not a file: " + file); + this.file = file; } @Override public boolean nextConfig(long timeout) { - if ( ! file.isFile()) throw new IllegalArgumentException("Not a file: " + file); + file.validateFile(); if (checkReloaded()) { log.log(FINE, () -> "User forced config reload at " + System.currentTimeMillis()); // User forced reload @@ -45,7 +42,7 @@ public class FileConfigSubscription<T extends ConfigInstance> extends ConfigSubs log.log(FINE, () -> "Config: " + configState.getConfig().toString()); return true; } - if (file.lastModified() != ts) { + if (file.getLastModified() != ts) { setConfigIncGen(updateConfig()); return true; } @@ -59,9 +56,9 @@ public class FileConfigSubscription<T extends ConfigInstance> extends ConfigSubs } private T updateConfig() { - ts = file.lastModified(); + ts = file.getLastModified(); try { - ConfigPayload payload = new CfgConfigPayloadBuilder().deserialize(Files.readAllLines(file.toPath())); + ConfigPayload payload = new CfgConfigPayloadBuilder().deserialize(file.getContent()); return payload.toInstance(configClass, key.getConfigId()); } catch (IOException e) { throw new ConfigurationRuntimeException(e); diff --git a/config/src/test/java/com/yahoo/config/subscription/impl/FileConfigSubscriptionTest.java b/config/src/test/java/com/yahoo/config/subscription/impl/FileConfigSubscriptionTest.java index e37a5d7b36b..aa948f2f0ae 100644 --- a/config/src/test/java/com/yahoo/config/subscription/impl/FileConfigSubscriptionTest.java +++ b/config/src/test/java/com/yahoo/config/subscription/impl/FileConfigSubscriptionTest.java @@ -2,6 +2,7 @@ package com.yahoo.config.subscription.impl; import com.yahoo.config.subscription.DirSource; +import com.yahoo.config.subscription.FileSource; import com.yahoo.foo.SimpletypesConfig; import com.yahoo.foo.TestReferenceConfig; import com.yahoo.vespa.config.ConfigKey; @@ -42,7 +43,7 @@ public class FileConfigSubscriptionTest { writeConfig("intval", "23"); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), - TEST_TYPES_FILE); + new FileSource(TEST_TYPES_FILE)); assertTrue(sub.nextConfig(1000)); assertEquals(23, sub.getConfigState().getConfig().intval()); Thread.sleep(1000); @@ -56,7 +57,7 @@ public class FileConfigSubscriptionTest { writeConfig("intval", "23"); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), - TEST_TYPES_FILE); + new FileSource(TEST_TYPES_FILE)); assertTrue(sub.nextConfig(1000)); assertEquals(23, sub.getConfigState().getConfig().intval()); writeConfig("intval", "33"); @@ -110,9 +111,10 @@ public class FileConfigSubscriptionTest { writeConfig("intval", "23"); ConfigSubscription<SimpletypesConfig> sub = new FileConfigSubscription<>( new ConfigKey<>(SimpletypesConfig.class, ""), - TEST_TYPES_FILE); + new FileSource(TEST_TYPES_FILE)); sub.reload(1); Files.delete(TEST_TYPES_FILE.toPath()); // delete file so the below statement throws exception sub.nextConfig(0); } + } diff --git a/container-core/src/test/java/com/yahoo/container/di/DirConfigSource.java b/container-core/src/test/java/com/yahoo/container/di/DirConfigSource.java index 7704827311c..071b4b17916 100644 --- a/container-core/src/test/java/com/yahoo/container/di/DirConfigSource.java +++ b/container-core/src/test/java/com/yahoo/container/di/DirConfigSource.java @@ -2,17 +2,14 @@ package com.yahoo.container.di; import com.yahoo.config.subscription.ConfigSource; -import com.yahoo.config.subscription.ConfigSourceSet; +import com.yahoo.config.subscription.DirSource; +import com.yahoo.config.subscription.FileSource; import org.junit.jupiter.api.Assertions; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.util.Random; - -import static java.nio.charset.StandardCharsets.UTF_8; +import java.io.UncheckedIOException; +import java.nio.file.Files; /** * @author Tony Vaagenes @@ -23,11 +20,11 @@ class DirConfigSource { private final File tempFolder; - DirConfigSource(File tmpDir) { + DirConfigSource(File tmpDir) { this.tempFolder = tmpDir; } - void writeConfig(String name, String contents) { + void writeConfig(String name, String contents) { try { Files.writeString(tempFolder.toPath().resolve(name + ".cfg"), contents); } @@ -36,13 +33,12 @@ class DirConfigSource { } } - String configId() { + String configId() { return "dir:" + tempFolder.getPath(); } - public ConfigSource configSource() { - return configSource; + ConfigSource configSource() { + return new DirSource(tempFolder); } - } |