diff options
author | gjoranv <gv@verizonmedia.com> | 2021-10-15 14:12:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-15 14:12:04 +0200 |
commit | c0302620c7121377a0734b6565734fffb4ec9bd6 (patch) | |
tree | 6ca0459d0178a3dbc29601105b878111c6d464f3 | |
parent | 0b1564f56523601b9f125a23c578801c46449fcb (diff) | |
parent | b5ec5c62a86cf10693f5043d3580ae8e16ebf90a (diff) |
Merge pull request #19582 from vespa-engine/container-config-improvements_take2
Container config improvements take2
11 files changed, 167 insertions, 142 deletions
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java index 123366d4695..27099790f5b 100644 --- a/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java +++ b/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java @@ -102,16 +102,11 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc } protected void setNewConfig(JRTClientConfigRequest jrtReq) { - Exception badConfigE = null; - T configInstance = null; try { - configInstance = toConfigInstance(jrtReq); + T configInstance = toConfigInstance(jrtReq); + setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsApplyOnRestart(), configInstance, jrtReq.getNewChecksums()); } catch (IllegalArgumentException e) { - badConfigE = e; - } - setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsApplyOnRestart(), configInstance, jrtReq.getNewChecksums()); - if (badConfigE != null) { - throw new IllegalArgumentException("Bad config from jrt", badConfigE); + throw new IllegalArgumentException("Bad config in response", e); } } diff --git a/container-core/src/main/java/com/yahoo/container/core/config/testutil/HandlersConfigurerTestWrapper.java b/container-core/src/main/java/com/yahoo/container/core/config/testutil/HandlersConfigurerTestWrapper.java index 973d5fb3736..99637e08b77 100644 --- a/container-core/src/main/java/com/yahoo/container/core/config/testutil/HandlersConfigurerTestWrapper.java +++ b/container-core/src/main/java/com/yahoo/container/core/config/testutil/HandlersConfigurerTestWrapper.java @@ -65,7 +65,7 @@ public class HandlersConfigurerTestWrapper { "query-profiles.cfg" }; private final Set<File> createdFiles = new LinkedHashSet<>(); - private int lastGeneration = 0; + private int lastGeneration = 1; private final Container container; private void createFiles(String configId) { diff --git a/container-core/src/main/java/com/yahoo/container/di/CloudSubscriber.java b/container-core/src/main/java/com/yahoo/container/di/CloudSubscriber.java new file mode 100644 index 00000000000..f252287b403 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/di/CloudSubscriber.java @@ -0,0 +1,99 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.di; + +import com.yahoo.config.ConfigInstance; +import com.yahoo.config.subscription.ConfigHandle; +import com.yahoo.config.subscription.ConfigSource; +import com.yahoo.config.subscription.ConfigSubscriber; +import com.yahoo.container.di.config.Subscriber; +import com.yahoo.vespa.config.ConfigKey; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static java.util.logging.Level.FINE; + +/** + * @author gjoranv + * @author Tony Vaagenes + * @author ollivir + */ +public class CloudSubscriber implements Subscriber { + private static final Logger log = Logger.getLogger(CloudSubscriber.class.getName()); + + private final String name; + private final ConfigSubscriber subscriber; + private final Map<ConfigKey<ConfigInstance>, ConfigHandle<ConfigInstance>> handles = new HashMap<>(); + + // if waitNextGeneration has not yet been called, -1 should be returned + private long generation = -1L; + + CloudSubscriber(String name, ConfigSource configSource, Set<ConfigKey<ConfigInstance>> keys) { + this.name = name; + this.subscriber = new ConfigSubscriber(configSource); + keys.forEach(k -> handles.put(k, subscriber.subscribe(k.getConfigClass(), k.getConfigId()))); + } + + @Override + public boolean configChanged() { + return handles.values().stream().anyMatch(ConfigHandle::isChanged); + } + + @Override + public long generation() { + return generation; + } + + //mapValues returns a view,, so we need to force evaluation of it here to prevent deferred evaluation. + @Override + public Map<ConfigKey<ConfigInstance>, ConfigInstance> config() { + Map<ConfigKey<ConfigInstance>, ConfigInstance> ret = new HashMap<>(); + handles.forEach((k, v) -> ret.put(k, v.getConfig())); + return ret; + } + + @Override + public long waitNextGeneration(boolean isInitializing) { + if (handles.isEmpty()) + throw new IllegalStateException("No config keys registered"); + + // Catch and just log config exceptions due to missing config values for parameters that do + // not have a default value. These exceptions occur when the user has removed a component + // from services.xml, and the component takes a config that has parameters without a + // default value in the def-file. There is a new 'components' config underway, where the + // component is removed, so this old config generation will soon be replaced by a new one. + boolean gotNextGen = false; + while ( ! gotNextGen) { + try { + if (subscriber.nextGeneration(isInitializing)) { + gotNextGen = true; + log.log(FINE, () -> this + " got next config generation " + subscriber.getGeneration() + "\n" + subscriber.toString()); + } + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Failed retrieving the next config generation", e); + } + } + + generation = subscriber.getGeneration(); + return generation; + } + + @Override + public void close() { + subscriber.close(); + } + + @Override + public String toString() { + return "CloudSubscriber{" + name + ", gen." + generation + "}"; + } + + // TODO: Remove, only used by test specific code in CloudSubscriberFactory + ConfigSubscriber getSubscriber() { + return subscriber; + } + +} diff --git a/container-core/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java b/container-core/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java index d50d56f8987..a6327b01e21 100644 --- a/container-core/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java +++ b/container-core/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java @@ -2,24 +2,19 @@ package com.yahoo.container.di; import com.yahoo.config.ConfigInstance; -import com.yahoo.config.subscription.ConfigHandle; import com.yahoo.config.subscription.ConfigSource; import com.yahoo.config.subscription.ConfigSourceSet; -import com.yahoo.config.subscription.ConfigSubscriber; import com.yahoo.container.di.config.Subscriber; import com.yahoo.container.di.config.SubscriberFactory; import com.yahoo.vespa.config.ConfigKey; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.WeakHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; /** * @author Tony Vaagenes @@ -27,8 +22,6 @@ import java.util.logging.Logger; */ public class CloudSubscriberFactory implements SubscriberFactory { - private static final Logger log = Logger.getLogger(CloudSubscriberFactory.class.getName()); - private final ConfigSource configSource; private final Map<CloudSubscriber, Integer> activeSubscribers = new WeakHashMap<>(); @@ -39,16 +32,16 @@ public class CloudSubscriberFactory implements SubscriberFactory { } @Override - public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys) { + public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys, String name) { Set<ConfigKey<ConfigInstance>> subscriptionKeys = new HashSet<>(); for(ConfigKey<?> key: configKeys) { @SuppressWarnings("unchecked") // ConfigKey is defined as <CONFIGCLASS extends ConfigInstance> ConfigKey<ConfigInstance> invariant = (ConfigKey<ConfigInstance>) key; subscriptionKeys.add(invariant); } - CloudSubscriber subscriber = new CloudSubscriber(subscriptionKeys, configSource); + CloudSubscriber subscriber = new CloudSubscriber(name, configSource, subscriptionKeys); - testGeneration.ifPresent(subscriber.subscriber::reload); // TODO: test specific code, remove + testGeneration.ifPresent(subscriber.getSubscriber()::reload); // TODO: test specific code, remove activeSubscribers.put(subscriber, 0); return subscriber; @@ -60,76 +53,7 @@ public class CloudSubscriberFactory implements SubscriberFactory { testGeneration = Optional.of(generation); List<CloudSubscriber> subscribers = new ArrayList<>(activeSubscribers.keySet()); - subscribers.forEach(s -> s.subscriber.reload(generation)); - } - - private static class CloudSubscriber implements Subscriber { - - private final ConfigSubscriber subscriber; - private final Map<ConfigKey<ConfigInstance>, ConfigHandle<ConfigInstance>> handles = new HashMap<>(); - - // if waitNextGeneration has not yet been called, -1 should be returned - private long generation = -1L; - - private CloudSubscriber(Set<ConfigKey<ConfigInstance>> keys, ConfigSource configSource) { - this.subscriber = new ConfigSubscriber(configSource); - keys.forEach(k -> handles.put(k, subscriber.subscribe(k.getConfigClass(), k.getConfigId()))); - } - - @Override - public boolean configChanged() { - return handles.values().stream().anyMatch(ConfigHandle::isChanged); - } - - @Override - public long generation() { - return generation; - } - - //mapValues returns a view,, so we need to force evaluation of it here to prevent deferred evaluation. - @Override - public Map<ConfigKey<ConfigInstance>, ConfigInstance> config() { - Map<ConfigKey<ConfigInstance>, ConfigInstance> ret = new HashMap<>(); - handles.forEach((k, v) -> ret.put(k, v.getConfig())); - return ret; - } - - @Override - public long waitNextGeneration(boolean isInitializing) { - if (handles.isEmpty()) - throw new IllegalStateException("No config keys registered"); - - // Catch and just log config exceptions due to missing config values for parameters that do - // not have a default value. These exceptions occur when the user has removed a component - // from services.xml, and the component takes a config that has parameters without a - // default value in the def-file. There is a new 'components' config underway, where the - // component is removed, so this old config generation will soon be replaced by a new one. - boolean gotNextGen = false; - int numExceptions = 0; - while ( ! gotNextGen) { - try { - if (subscriber.nextGeneration(isInitializing)) - gotNextGen = true; - } - catch (IllegalArgumentException e) { - numExceptions++; - log.log(Level.WARNING, "Got exception from the config system (ignore if you just removed a " + - "component from your application that used the mentioned config) Subscriber info: " + - subscriber.toString(), e); - if (numExceptions >= 5) - throw new IllegalArgumentException("Failed retrieving the next config generation", e); - } - } - - generation = subscriber.getGeneration(); - return generation; - } - - @Override - public void close() { - subscriber.close(); - } - + subscribers.forEach(s -> s.getSubscriber().reload(generation)); } public static class Provider implements com.google.inject.Provider<SubscriberFactory> { diff --git a/container-core/src/main/java/com/yahoo/container/di/ConfigRetriever.java b/container-core/src/main/java/com/yahoo/container/di/ConfigRetriever.java index 1e7f3e06049..c90f05e2227 100644 --- a/container-core/src/main/java/com/yahoo/container/di/ConfigRetriever.java +++ b/container-core/src/main/java/com/yahoo/container/di/ConfigRetriever.java @@ -5,6 +5,7 @@ import com.google.common.collect.Sets; import com.yahoo.config.ConfigInstance; import com.yahoo.container.di.componentgraph.core.Keys; import com.yahoo.container.di.config.Subscriber; +import com.yahoo.container.di.config.SubscriberFactory; import com.yahoo.vespa.config.ConfigKey; import java.util.Collections; @@ -29,20 +30,21 @@ public final class ConfigRetriever { private final Set<ConfigKey<? extends ConfigInstance>> bootstrapKeys; private Set<ConfigKey<? extends ConfigInstance>> componentSubscriberKeys; + + private final SubscriberFactory subscriberFactory; private final Subscriber bootstrapSubscriber; private Subscriber componentSubscriber; - private final Function<Set<ConfigKey<? extends ConfigInstance>>, Subscriber> subscribe; + private int componentSubscriberIndex; - public ConfigRetriever(Set<ConfigKey<? extends ConfigInstance>> bootstrapKeys, - Function<Set<ConfigKey<? extends ConfigInstance>>, Subscriber> subscribe) { + public ConfigRetriever(Set<ConfigKey<? extends ConfigInstance>> bootstrapKeys, SubscriberFactory subscriberFactory) { this.bootstrapKeys = bootstrapKeys; this.componentSubscriberKeys = new HashSet<>(); - this.subscribe = subscribe; + this.subscriberFactory = subscriberFactory; if (bootstrapKeys.isEmpty()) { throw new IllegalArgumentException("Bootstrap key set is empty"); } - this.bootstrapSubscriber = subscribe.apply(bootstrapKeys); - this.componentSubscriber = subscribe.apply(componentSubscriberKeys); + this.bootstrapSubscriber = this.subscriberFactory.getSubscriber(bootstrapKeys, "bootstrap"); + this.componentSubscriber = this.subscriberFactory.getSubscriber(componentSubscriberKeys, "component_" + ++componentSubscriberIndex); } public ConfigSnapshot getConfigs(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys, @@ -58,48 +60,51 @@ public final class ConfigRetriever { } } - Optional<ConfigSnapshot> getConfigsOnce(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys, - long leastGeneration, boolean isInitializing) { + private Optional<ConfigSnapshot> getConfigsOnce(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys, + long leastGeneration, boolean isInitializing) { if (!Sets.intersection(componentConfigKeys, bootstrapKeys).isEmpty()) { throw new IllegalArgumentException( "Component config keys [" + componentConfigKeys + "] overlaps with bootstrap config keys [" + bootstrapKeys + "]"); } - log.log(FINE, () -> "getConfigsOnce: " + componentConfigKeys); - Set<ConfigKey<? extends ConfigInstance>> allKeys = new HashSet<>(componentConfigKeys); allKeys.addAll(bootstrapKeys); setupComponentSubscriber(allKeys); - return getConfigsOptional(leastGeneration, isInitializing); + var maybeSnapshot = getConfigsOptional(leastGeneration, isInitializing); + log.log(FINE, () -> "getConfigsOnce returning " + maybeSnapshot); + return maybeSnapshot; } private Optional<ConfigSnapshot> getConfigsOptional(long leastGeneration, boolean isInitializing) { - long newestComponentGeneration = componentSubscriber.waitNextGeneration(isInitializing); - log.log(FINE, () -> "getConfigsOptional: new component generation: " + newestComponentGeneration); + if (componentSubscriber.generation() < bootstrapSubscriber.generation()) { + return getComponentsSnapshot(leastGeneration, isInitializing); + } + long newestBootstrapGeneration = bootstrapSubscriber.waitNextGeneration(isInitializing); + log.log(FINE, () -> "getConfigsOptional: new bootstrap generation: " + newestBootstrapGeneration); + + // leastGeneration is used to ensure newer generation (than the latest bootstrap or component gen) + // when the previous generation was invalidated due to an exception upon creating the component graph. + if (newestBootstrapGeneration < leastGeneration) { + return Optional.empty(); + } + return bootstrapConfigIfChanged(); + } - // leastGeneration is only used to ensure newer generation when the previous generation was invalidated due to an exception + private Optional<ConfigSnapshot> getComponentsSnapshot(long leastGeneration, boolean isInitializing) { + long newestBootstrapGeneration = bootstrapSubscriber.generation(); + long newestComponentGeneration = componentSubscriber.waitNextGeneration(isInitializing); if (newestComponentGeneration < leastGeneration) { + log.log(FINE, () -> "Component generation too old: " + componentSubscriber.generation() + " < " + leastGeneration); return Optional.empty(); - } else if (bootstrapSubscriber.generation() < newestComponentGeneration) { - long newestBootstrapGeneration = bootstrapSubscriber.waitNextGeneration(isInitializing); - log.log(FINE, () -> "getConfigsOptional: new bootstrap generation: " + bootstrapSubscriber.generation()); - Optional<ConfigSnapshot> bootstrapConfig = bootstrapConfigIfChanged(); - if (bootstrapConfig.isPresent()) { - return bootstrapConfig; - } else { - if (newestBootstrapGeneration == newestComponentGeneration) { - log.log(FINE, () -> "Got new components configs with unchanged bootstrap configs."); - return componentsConfigIfChanged(); - } else { - // This should not be a normal case, and hence a warning to allow investigation. - log.warning("Did not get same generation for bootstrap (" + newestBootstrapGeneration + - ") and components configs (" + newestComponentGeneration + ")."); - return Optional.empty(); - } - } - } else { - // bootstrapGen==componentGen (happens only when a new component subscriber returns first config after bootstrap) + } + if (newestComponentGeneration == newestBootstrapGeneration) { + log.log(FINE, () -> "getConfigsOptional: new component generation: " + componentSubscriber.generation()); return componentsConfigIfChanged(); + } else { + // Should not be a normal case, and hence a warning to allow investigation. + log.warning("Did not get same generation for bootstrap (" + newestBootstrapGeneration + + ") and components configs (" + newestComponentGeneration + ")."); + return Optional.empty(); } } @@ -120,8 +125,8 @@ public final class ConfigRetriever { } } - private void resetComponentSubscriberIfBootstrap(ConfigSnapshot snapshot) { - if (snapshot instanceof BootstrapConfigs) { + private void resetComponentSubscriberIfBootstrap(ConfigSnapshot configSnapshot) { + if (configSnapshot instanceof BootstrapConfigs) { setupComponentSubscriber(Collections.emptySet()); } } @@ -129,10 +134,11 @@ public final class ConfigRetriever { private void setupComponentSubscriber(Set<ConfigKey<? extends ConfigInstance>> keys) { if (! componentSubscriberKeys.equals(keys)) { componentSubscriber.close(); + log.log(FINE, () -> "Closed " + componentSubscriber); componentSubscriberKeys = keys; try { - log.log(FINE, () -> "Setting up new component subscriber for keys: " + keys); - componentSubscriber = subscribe.apply(keys); + componentSubscriber = subscriberFactory.getSubscriber(keys, "component_" + ++componentSubscriberIndex); + log.log(FINE, () -> "Set up new subscriber " + componentSubscriber + " for keys: " + keys); } catch (Throwable e) { log.log(Level.WARNING, "Failed setting up subscriptions for component configs: " + e.getMessage()); log.log(Level.WARNING, "Config keys: " + keys); diff --git a/container-core/src/main/java/com/yahoo/container/di/Container.java b/container-core/src/main/java/com/yahoo/container/di/Container.java index bec685c71ef..e437f440c41 100644 --- a/container-core/src/main/java/com/yahoo/container/di/Container.java +++ b/container-core/src/main/java/com/yahoo/container/di/Container.java @@ -48,7 +48,7 @@ public class Container { private final ComponentDeconstructor componentDeconstructor; private final Osgi osgi; - private final ConfigRetriever configurer; + private final ConfigRetriever retriever; private List<String> platformBundles; // Used to verify that platform bundles don't change. private long previousConfigGeneration = -1L; private long leastGeneration = -1L; @@ -62,7 +62,7 @@ public class Container { platformBundlesConfigKey = new ConfigKey<>(PlatformBundlesConfig.class, configId); componentsConfigKey = new ConfigKey<>(ComponentsConfig.class, configId); var bootstrapKeys = Set.of(applicationBundlesConfigKey, platformBundlesConfigKey, componentsConfigKey); - this.configurer = new ConfigRetriever(bootstrapKeys, subscriberFactory::getSubscriber); + this.retriever = new ConfigRetriever(bootstrapKeys, subscriberFactory); } public Container(SubscriberFactory subscriberFactory, String configId, ComponentDeconstructor componentDeconstructor) { @@ -91,10 +91,10 @@ public class Container { { ConfigSnapshot snapshot; while (true) { - snapshot = configurer.getConfigs(graph.configKeys(), leastGeneration, isInitializing); + snapshot = retriever.getConfigs(graph.configKeys(), leastGeneration, isInitializing); if (log.isLoggable(FINE)) - log.log(FINE, String.format("createNewGraph:\n" + "graph.configKeys = %s\n" + "graph.generation = %s\n" + "snapshot = %s\n", + log.log(FINE, String.format("getConfigAndCreateGraph:\n" + "graph.configKeys = %s\n" + "graph.generation = %s\n" + "snapshot = %s\n", graph.configKeys(), graph.generation(), snapshot)); if (snapshot instanceof BootstrapConfigs) { @@ -127,11 +127,11 @@ public class Container { } private long getBootstrapGeneration() { - return configurer.getBootstrapGeneration(); + return retriever.getBootstrapGeneration(); } private long getComponentsGeneration() { - return configurer.getComponentsGeneration(); + return retriever.getComponentsGeneration(); } private String configGenerationsString() { @@ -215,7 +215,7 @@ public class Container { } private void invalidateGeneration(long generation, Throwable cause) { - leastGeneration = Math.max(configurer.getComponentsGeneration(), configurer.getBootstrapGeneration()) + 1; + leastGeneration = Math.max(retriever.getComponentsGeneration(), retriever.getBootstrapGeneration()) + 1; if (!(cause instanceof InterruptedException) && !(cause instanceof ConfigInterruptedException)) { log.log(Level.WARNING, newGraphErrorMessage(generation, cause), cause); } @@ -250,7 +250,7 @@ public class Container { } void shutdownConfigurer() { - configurer.shutdown(); + retriever.shutdown(); } // Reload config manually, when subscribing to non-configserver sources diff --git a/container-core/src/main/java/com/yahoo/container/di/config/SubscriberFactory.java b/container-core/src/main/java/com/yahoo/container/di/config/SubscriberFactory.java index 1bfd4344b90..f11f44413c7 100644 --- a/container-core/src/main/java/com/yahoo/container/di/config/SubscriberFactory.java +++ b/container-core/src/main/java/com/yahoo/container/di/config/SubscriberFactory.java @@ -14,7 +14,7 @@ import java.util.Set; @ProvidedBy(CloudSubscriberFactory.Provider.class) public interface SubscriberFactory { - Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys); + Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys, String name); void reloadActiveSubscribers(long generation); } diff --git a/container-core/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java b/container-core/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java index bba5675e458..99ea6a4ee58 100644 --- a/container-core/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java +++ b/container-core/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java @@ -19,7 +19,6 @@ import org.junit.rules.ExpectedException; import java.util.Collections; import java.util.HashSet; -import java.util.Optional; import java.util.Set; import static org.hamcrest.CoreMatchers.instanceOf; @@ -108,11 +107,11 @@ public class ConfigRetrieverTest { private ConfigRetriever createConfigRetriever() { String configId = dirConfigSource.configId(); - CloudSubscriberFactory subscriber = new CloudSubscriberFactory(dirConfigSource.configSource()); + CloudSubscriberFactory subscriberFactory = new CloudSubscriberFactory(dirConfigSource.configSource()); Set<ConfigKey<? extends ConfigInstance>> keys = new HashSet<>(); keys.add(new ConfigKey<>(Bootstrap1Config.class, configId)); keys.add(new ConfigKey<>(Bootstrap2Config.class, configId)); - return new ConfigRetriever(keys, keySet -> subscriber.getSubscriber(keySet)); + return new ConfigRetriever(keys, subscriberFactory); } private void writeConfig(String name, String contents) { diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java index 219616500c8..099df79cd9b 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java @@ -212,7 +212,8 @@ public final class ConfiguredApplication implements Application { } private <T extends ConfigInstance> T getConfig(Class<T> configClass, boolean isInitializing) { - Subscriber subscriber = subscriberFactory.getSubscriber(Collections.singleton(new ConfigKey<>(configClass, configId))); + Subscriber subscriber = subscriberFactory.getSubscriber(Collections.singleton(new ConfigKey<>(configClass, configId)), + configClass.getName()); try { subscriber.waitNextGeneration(isInitializing); return configClass.cast(first(subscriber.config().values())); @@ -222,7 +223,8 @@ public final class ConfiguredApplication implements Application { } private void watchPortChange() { - Subscriber subscriber = subscriberFactory.getSubscriber(Collections.singleton(new ConfigKey<>(QrConfig.class, configId))); + Subscriber subscriber = subscriberFactory.getSubscriber(Collections.singleton(new ConfigKey<>(QrConfig.class, configId)), + "portWatcher"); try { while (true) { subscriber.waitNextGeneration(false); diff --git a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java index 8e8367cbe4c..d9db169ec54 100644 --- a/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java +++ b/standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java @@ -83,7 +83,7 @@ public class StandaloneSubscriberFactory implements SubscriberFactory { @Override @SuppressWarnings("unchecked") - public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys) { + public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys, String name) { return new StandaloneSubscriber((Set<ConfigKey<ConfigInstance>>) configKeys); } diff --git a/standalone-container/src/test/java/com/yahoo/container/standalone/StandaloneSubscriberTest.java b/standalone-container/src/test/java/com/yahoo/container/standalone/StandaloneSubscriberTest.java index 76e3f9e6ec0..ecfc2caf722 100644 --- a/standalone-container/src/test/java/com/yahoo/container/standalone/StandaloneSubscriberTest.java +++ b/standalone-container/src/test/java/com/yahoo/container/standalone/StandaloneSubscriberTest.java @@ -39,7 +39,7 @@ public class StandaloneSubscriberTest { keys.add(platformBundlesKey); keys.add(applicationBundlesKey); keys.add(componentsKey); - Subscriber subscriber = new StandaloneSubscriberFactory(root).getSubscriber(keys); + Subscriber subscriber = new StandaloneSubscriberFactory(root).getSubscriber(keys, "standalone"); Map<ConfigKey<ConfigInstance>, ConfigInstance> config = subscriber.config(); assertEquals(2, config.size()); |