summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2021-10-15 12:27:26 +0200
committergjoranv <gv@verizonmedia.com>2021-10-15 12:27:26 +0200
commit9e8e87e17a282ae396c40717b4f8caccf155c53c (patch)
tree6240005ac3d83534bb406c07ae652167f7c4fe54
parentf2781d1ecbbaf1214463e76eca3359a386d23d70 (diff)
Reapply "Container config improvements [run-systemtest]"
This reverts commit 868c29b272eb7773d5c4515cb33640a44074d05a.
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/config/testutil/HandlersConfigurerTestWrapper.java2
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/CloudSubscriber.java99
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java84
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/ConfigRetriever.java87
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/Container.java16
-rw-r--r--container-core/src/main/java/com/yahoo/container/di/config/SubscriberFactory.java2
-rw-r--r--container-core/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java5
-rw-r--r--container-disc/src/main/java/com/yahoo/container/jdisc/ConfiguredApplication.java6
-rw-r--r--standalone-container/src/main/java/com/yahoo/container/standalone/StandaloneSubscriberFactory.java2
-rw-r--r--standalone-container/src/test/java/com/yahoo/container/standalone/StandaloneSubscriberTest.java2
10 files changed, 163 insertions, 142 deletions
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..ff238bd2497 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,9 +5,9 @@ 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;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
@@ -29,20 +29,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,
@@ -51,55 +52,56 @@ public final class ConfigRetriever {
while (true) {
Optional<ConfigSnapshot> maybeSnapshot = getConfigsOnce(componentConfigKeys, leastGeneration, isInitializing);
if (maybeSnapshot.isPresent()) {
- var configSnapshot = maybeSnapshot.get();
- resetComponentSubscriberIfBootstrap(configSnapshot);
- return configSnapshot;
+ return maybeSnapshot.get();
}
}
}
- 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,19 +122,14 @@ public final class ConfigRetriever {
}
}
- private void resetComponentSubscriberIfBootstrap(ConfigSnapshot snapshot) {
- if (snapshot instanceof BootstrapConfigs) {
- setupComponentSubscriber(Collections.emptySet());
- }
- }
-
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());