aboutsummaryrefslogtreecommitdiffstats
path: root/container-core/src
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-10-14 18:01:16 +0200
committerGitHub <noreply@github.com>2021-10-14 18:01:16 +0200
commit868c29b272eb7773d5c4515cb33640a44074d05a (patch)
tree1fdcbfbb9840a92e8068e20296a94c12a5da389f /container-core/src
parentffcc28f2b9180ad8774c67fddbebc81b41f2fc6c (diff)
Revert "Container config improvements [run-systemtest]"
Diffstat (limited to 'container-core/src')
-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
7 files changed, 138 insertions, 157 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 99637e08b77..973d5fb3736 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 = 1;
+ private int lastGeneration = 0;
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
deleted file mode 100644
index f252287b403..00000000000
--- a/container-core/src/main/java/com/yahoo/container/di/CloudSubscriber.java
+++ /dev/null
@@ -1,99 +0,0 @@
-// 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 a6327b01e21..d50d56f8987 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,19 +2,24 @@
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
@@ -22,6 +27,8 @@ import java.util.WeakHashMap;
*/
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<>();
@@ -32,16 +39,16 @@ public class CloudSubscriberFactory implements SubscriberFactory {
}
@Override
- public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys, String name) {
+ public Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys) {
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(name, configSource, subscriptionKeys);
+ CloudSubscriber subscriber = new CloudSubscriber(subscriptionKeys, configSource);
- testGeneration.ifPresent(subscriber.getSubscriber()::reload); // TODO: test specific code, remove
+ testGeneration.ifPresent(subscriber.subscriber::reload); // TODO: test specific code, remove
activeSubscribers.put(subscriber, 0);
return subscriber;
@@ -53,7 +60,76 @@ public class CloudSubscriberFactory implements SubscriberFactory {
testGeneration = Optional.of(generation);
List<CloudSubscriber> subscribers = new ArrayList<>(activeSubscribers.keySet());
- subscribers.forEach(s -> s.getSubscriber().reload(generation));
+ 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();
+ }
+
}
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 ff238bd2497..1e7f3e06049 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,21 +29,20 @@ 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 int componentSubscriberIndex;
+ private final Function<Set<ConfigKey<? extends ConfigInstance>>, Subscriber> subscribe;
- public ConfigRetriever(Set<ConfigKey<? extends ConfigInstance>> bootstrapKeys, SubscriberFactory subscriberFactory) {
+ public ConfigRetriever(Set<ConfigKey<? extends ConfigInstance>> bootstrapKeys,
+ Function<Set<ConfigKey<? extends ConfigInstance>>, Subscriber> subscribe) {
this.bootstrapKeys = bootstrapKeys;
this.componentSubscriberKeys = new HashSet<>();
- this.subscriberFactory = subscriberFactory;
+ this.subscribe = subscribe;
if (bootstrapKeys.isEmpty()) {
throw new IllegalArgumentException("Bootstrap key set is empty");
}
- this.bootstrapSubscriber = this.subscriberFactory.getSubscriber(bootstrapKeys, "bootstrap");
- this.componentSubscriber = this.subscriberFactory.getSubscriber(componentSubscriberKeys, "component_" + ++componentSubscriberIndex);
+ this.bootstrapSubscriber = subscribe.apply(bootstrapKeys);
+ this.componentSubscriber = subscribe.apply(componentSubscriberKeys);
}
public ConfigSnapshot getConfigs(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys,
@@ -52,56 +51,55 @@ public final class ConfigRetriever {
while (true) {
Optional<ConfigSnapshot> maybeSnapshot = getConfigsOnce(componentConfigKeys, leastGeneration, isInitializing);
if (maybeSnapshot.isPresent()) {
- return maybeSnapshot.get();
+ var configSnapshot = maybeSnapshot.get();
+ resetComponentSubscriberIfBootstrap(configSnapshot);
+ return configSnapshot;
}
}
}
- private Optional<ConfigSnapshot> getConfigsOnce(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys,
- long leastGeneration, boolean isInitializing) {
+ 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);
- var maybeSnapshot = getConfigsOptional(leastGeneration, isInitializing);
- log.log(FINE, () -> "getConfigsOnce returning " + maybeSnapshot);
- return maybeSnapshot;
+ return getConfigsOptional(leastGeneration, isInitializing);
}
private Optional<ConfigSnapshot> getConfigsOptional(long leastGeneration, boolean isInitializing) {
- 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();
- }
-
- private Optional<ConfigSnapshot> getComponentsSnapshot(long leastGeneration, boolean isInitializing) {
- long newestBootstrapGeneration = bootstrapSubscriber.generation();
long newestComponentGeneration = componentSubscriber.waitNextGeneration(isInitializing);
+ log.log(FINE, () -> "getConfigsOptional: new component generation: " + newestComponentGeneration);
+
+ // leastGeneration is only used to ensure newer generation when the previous generation was invalidated due to an exception
if (newestComponentGeneration < leastGeneration) {
- log.log(FINE, () -> "Component generation too old: " + componentSubscriber.generation() + " < " + leastGeneration);
return Optional.empty();
- }
- 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 +
+ } 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();
+ return Optional.empty();
+ }
+ }
+ } else {
+ // bootstrapGen==componentGen (happens only when a new component subscriber returns first config after bootstrap)
+ return componentsConfigIfChanged();
}
}
@@ -122,14 +120,19 @@ 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 {
- componentSubscriber = subscriberFactory.getSubscriber(keys, "component_" + ++componentSubscriberIndex);
- log.log(FINE, () -> "Set up new subscriber " + componentSubscriber + " for keys: " + keys);
+ log.log(FINE, () -> "Setting up new component subscriber for keys: " + keys);
+ componentSubscriber = subscribe.apply(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 e437f440c41..bec685c71ef 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 retriever;
+ private final ConfigRetriever configurer;
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.retriever = new ConfigRetriever(bootstrapKeys, subscriberFactory);
+ this.configurer = new ConfigRetriever(bootstrapKeys, subscriberFactory::getSubscriber);
}
public Container(SubscriberFactory subscriberFactory, String configId, ComponentDeconstructor componentDeconstructor) {
@@ -91,10 +91,10 @@ public class Container {
{
ConfigSnapshot snapshot;
while (true) {
- snapshot = retriever.getConfigs(graph.configKeys(), leastGeneration, isInitializing);
+ snapshot = configurer.getConfigs(graph.configKeys(), leastGeneration, isInitializing);
if (log.isLoggable(FINE))
- log.log(FINE, String.format("getConfigAndCreateGraph:\n" + "graph.configKeys = %s\n" + "graph.generation = %s\n" + "snapshot = %s\n",
+ log.log(FINE, String.format("createNewGraph:\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 retriever.getBootstrapGeneration();
+ return configurer.getBootstrapGeneration();
}
private long getComponentsGeneration() {
- return retriever.getComponentsGeneration();
+ return configurer.getComponentsGeneration();
}
private String configGenerationsString() {
@@ -215,7 +215,7 @@ public class Container {
}
private void invalidateGeneration(long generation, Throwable cause) {
- leastGeneration = Math.max(retriever.getComponentsGeneration(), retriever.getBootstrapGeneration()) + 1;
+ leastGeneration = Math.max(configurer.getComponentsGeneration(), configurer.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() {
- retriever.shutdown();
+ configurer.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 f11f44413c7..1bfd4344b90 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, String name);
+ Subscriber getSubscriber(Set<? extends ConfigKey<?>> configKeys);
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 99ea6a4ee58..bba5675e458 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,6 +19,7 @@ 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;
@@ -107,11 +108,11 @@ public class ConfigRetrieverTest {
private ConfigRetriever createConfigRetriever() {
String configId = dirConfigSource.configId();
- CloudSubscriberFactory subscriberFactory = new CloudSubscriberFactory(dirConfigSource.configSource());
+ CloudSubscriberFactory subscriber = 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, subscriberFactory);
+ return new ConfigRetriever(keys, keySet -> subscriber.getSubscriber(keySet));
}
private void writeConfig(String name, String contents) {