summaryrefslogtreecommitdiffstats
path: root/container-di/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-12-16 22:15:52 +0100
committerJon Bratseth <bratseth@gmail.com>2020-12-16 22:15:52 +0100
commitb194c494bc568ced02a98695bc41219b170acf37 (patch)
tree0e22193a21aeddb945663795232066c44fc2e3eb /container-di/src
parent99ad735154f1aa3cd40b7d7028c11bf19225d1b3 (diff)
Track explicitly when we are initializing config
Diffstat (limited to 'container-di/src')
-rw-r--r--container-di/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java4
-rw-r--r--container-di/src/main/java/com/yahoo/container/di/ConfigRetriever.java18
-rw-r--r--container-di/src/main/java/com/yahoo/container/di/Container.java13
-rw-r--r--container-di/src/main/java/com/yahoo/container/di/config/Subscriber.java2
-rw-r--r--container-di/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java16
-rw-r--r--container-di/src/test/java/com/yahoo/container/di/ContainerTest.java4
-rw-r--r--container-di/src/test/java/com/yahoo/container/di/ContainerTestBase.java4
7 files changed, 32 insertions, 29 deletions
diff --git a/container-di/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java b/container-di/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java
index 75a660789e2..d43f96c9b4a 100644
--- a/container-di/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java
+++ b/container-di/src/main/java/com/yahoo/container/di/CloudSubscriberFactory.java
@@ -95,7 +95,7 @@ public class CloudSubscriberFactory implements SubscriberFactory {
}
@Override
- public long waitNextGeneration() {
+ public long waitNextGeneration(boolean isInitializing) {
if (handles.isEmpty())
throw new IllegalStateException("No config keys registered");
@@ -108,7 +108,7 @@ public class CloudSubscriberFactory implements SubscriberFactory {
int numExceptions = 0;
while ( ! gotNextGen) {
try {
- if (subscriber.nextGeneration())
+ if (subscriber.nextGeneration(isInitializing))
gotNextGen = true;
}
catch (IllegalArgumentException e) {
diff --git a/container-di/src/main/java/com/yahoo/container/di/ConfigRetriever.java b/container-di/src/main/java/com/yahoo/container/di/ConfigRetriever.java
index cf80009f3f6..a7ff6c46a8b 100644
--- a/container-di/src/main/java/com/yahoo/container/di/ConfigRetriever.java
+++ b/container-di/src/main/java/com/yahoo/container/di/ConfigRetriever.java
@@ -46,10 +46,10 @@ public final class ConfigRetriever {
}
public ConfigSnapshot getConfigs(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys,
- long leastGeneration) {
+ long leastGeneration, boolean isInitializing) {
// Loop until we get config.
while (true) {
- Optional<ConfigSnapshot> maybeSnapshot = getConfigsOnce(componentConfigKeys, leastGeneration);
+ Optional<ConfigSnapshot> maybeSnapshot = getConfigsOnce(componentConfigKeys, leastGeneration, isInitializing);
if (maybeSnapshot.isPresent()) {
var configSnapshot = maybeSnapshot.get();
resetComponentSubscriberIfBootstrap(configSnapshot);
@@ -59,7 +59,7 @@ public final class ConfigRetriever {
}
Optional<ConfigSnapshot> getConfigsOnce(Set<ConfigKey<? extends ConfigInstance>> componentConfigKeys,
- long leastGeneration) {
+ long leastGeneration, boolean isInitializing) {
if (!Sets.intersection(componentConfigKeys, bootstrapKeys).isEmpty()) {
throw new IllegalArgumentException(
"Component config keys [" + componentConfigKeys + "] overlaps with bootstrap config keys [" + bootstrapKeys + "]");
@@ -70,18 +70,18 @@ public final class ConfigRetriever {
allKeys.addAll(bootstrapKeys);
setupComponentSubscriber(allKeys);
- return getConfigsOptional(leastGeneration);
+ return getConfigsOptional(leastGeneration, isInitializing);
}
- private Optional<ConfigSnapshot> getConfigsOptional(long leastGeneration) {
- long newestComponentGeneration = componentSubscriber.waitNextGeneration();
+ private Optional<ConfigSnapshot> getConfigsOptional(long leastGeneration, boolean isInitializing) {
+ 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) {
return Optional.empty();
} else if (bootstrapSubscriber.generation() < newestComponentGeneration) {
- long newestBootstrapGeneration = bootstrapSubscriber.waitNextGeneration();
+ long newestBootstrapGeneration = bootstrapSubscriber.waitNextGeneration(isInitializing);
log.log(FINE, "getConfigsOptional: new bootstrap generation: " + bootstrapSubscriber.generation());
Optional<ConfigSnapshot> bootstrapConfig = bootstrapConfigIfChanged();
if (bootstrapConfig.isPresent()) {
@@ -92,8 +92,8 @@ public final class ConfigRetriever {
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 + ").");
+ log.warning("Did not get same generation for bootstrap (" + newestBootstrapGeneration +
+ ") and components configs (" + newestComponentGeneration + ").");
return Optional.empty();
}
}
diff --git a/container-di/src/main/java/com/yahoo/container/di/Container.java b/container-di/src/main/java/com/yahoo/container/di/Container.java
index 7855cd6b2f1..82c7f65bc2a 100644
--- a/container-di/src/main/java/com/yahoo/container/di/Container.java
+++ b/container-di/src/main/java/com/yahoo/container/di/Container.java
@@ -44,9 +44,9 @@ public class Container {
private static final Logger log = Logger.getLogger(Container.class.getName());
private final SubscriberFactory subscriberFactory;
- private ConfigKey<ApplicationBundlesConfig> applicationBundlesConfigKey;
- private ConfigKey<PlatformBundlesConfig> platformBundlesConfigKey;
- private ConfigKey<ComponentsConfig> componentsConfigKey;
+ private final ConfigKey<ApplicationBundlesConfig> applicationBundlesConfigKey;
+ private final ConfigKey<PlatformBundlesConfig> platformBundlesConfigKey;
+ private final ConfigKey<ComponentsConfig> componentsConfigKey;
private final ComponentDeconstructor componentDeconstructor;
private final Osgi osgi;
@@ -72,10 +72,10 @@ public class Container {
});
}
- public ComponentGraph getNewComponentGraph(ComponentGraph oldGraph, Injector fallbackInjector) {
+ public ComponentGraph getNewComponentGraph(ComponentGraph oldGraph, Injector fallbackInjector, boolean isInitializing) {
try {
Collection<Bundle> obsoleteBundles = new HashSet<>();
- ComponentGraph newGraph = getConfigAndCreateGraph(oldGraph, fallbackInjector, obsoleteBundles);
+ ComponentGraph newGraph = getConfigAndCreateGraph(oldGraph, fallbackInjector, isInitializing, obsoleteBundles);
newGraph.reuseNodes(oldGraph);
constructComponents(newGraph);
deconstructObsoleteComponents(oldGraph, newGraph, obsoleteBundles);
@@ -88,11 +88,12 @@ public class Container {
private ComponentGraph getConfigAndCreateGraph(ComponentGraph graph,
Injector fallbackInjector,
+ boolean isInitializing,
Collection<Bundle> obsoleteBundles) // NOTE: Return value
{
ConfigSnapshot snapshot;
while (true) {
- snapshot = configurer.getConfigs(graph.configKeys(), leastGeneration);
+ snapshot = configurer.getConfigs(graph.configKeys(), leastGeneration, isInitializing);
log.log(FINE, String.format("createNewGraph:\n" + "graph.configKeys = %s\n" + "graph.generation = %s\n" + "snapshot = %s\n",
graph.configKeys(), graph.generation(), snapshot));
diff --git a/container-di/src/main/java/com/yahoo/container/di/config/Subscriber.java b/container-di/src/main/java/com/yahoo/container/di/config/Subscriber.java
index 9fd30f888b9..60207447bfd 100644
--- a/container-di/src/main/java/com/yahoo/container/di/config/Subscriber.java
+++ b/container-di/src/main/java/com/yahoo/container/di/config/Subscriber.java
@@ -12,7 +12,7 @@ import java.util.Map;
*/
public interface Subscriber {
- long waitNextGeneration();
+ long waitNextGeneration(boolean isInitializing);
long generation();
boolean configChanged();
diff --git a/container-di/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java b/container-di/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java
index 4751b9b74b7..290836d7842 100644
--- a/container-di/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java
+++ b/container-di/src/test/java/com/yahoo/container/di/ConfigRetrieverTest.java
@@ -51,7 +51,7 @@ public class ConfigRetrieverTest {
public void require_that_bootstrap_configs_come_first() {
writeConfigs();
ConfigRetriever retriever = createConfigRetriever();
- ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0);
+ ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0, true);
assertThat(bootstrapConfigs, Matchers.instanceOf(BootstrapConfigs.class));
}
@@ -61,10 +61,10 @@ public class ConfigRetrieverTest {
public void require_that_components_comes_after_bootstrap() {
writeConfigs();
ConfigRetriever retriever = createConfigRetriever();
- ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0);
+ ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0, true);
ConfigKey<? extends ConfigInstance> testConfigKey = new ConfigKey<>(TestConfig.class, dirConfigSource.configId());
- ConfigSnapshot componentsConfigs = retriever.getConfigs(Collections.singleton(testConfigKey), 0);
+ ConfigSnapshot componentsConfigs = retriever.getConfigs(Collections.singleton(testConfigKey), 0, true);
if (componentsConfigs instanceof ComponentsConfigs) {
assertThat(componentsConfigs.size(), is(3));
@@ -84,20 +84,20 @@ public class ConfigRetrieverTest {
writeConfigs();
ConfigRetriever retriever = createConfigRetriever();
ConfigKey<? extends ConfigInstance> testConfigKey = new ConfigKey<>(TestConfig.class, dirConfigSource.configId());
- ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0);
- ConfigSnapshot componentsConfigs = retriever.getConfigs(Collections.singleton(testConfigKey), 0);
+ ConfigSnapshot bootstrapConfigs = retriever.getConfigs(Collections.emptySet(), 0, true);
+ ConfigSnapshot componentsConfigs = retriever.getConfigs(Collections.singleton(testConfigKey), 0, true);
Set<ConfigKey<? extends ConfigInstance>> keys = new HashSet<>();
keys.add(testConfigKey);
keys.add(new ConfigKey<>(TestConfig.class, ""));
- retriever.getConfigs(keys, 0);
+ retriever.getConfigs(keys, 0, true);
}
@Test
public void require_that_empty_components_keys_after_bootstrap_returns_components_configs() {
writeConfigs();
ConfigRetriever retriever = createConfigRetriever();
- assertThat(retriever.getConfigs(Collections.emptySet(), 0), instanceOf(BootstrapConfigs.class));
- assertThat(retriever.getConfigs(Collections.emptySet(), 0), instanceOf(ComponentsConfigs.class));
+ assertThat(retriever.getConfigs(Collections.emptySet(), 0, true), instanceOf(BootstrapConfigs.class));
+ assertThat(retriever.getConfigs(Collections.emptySet(), 0, true), instanceOf(ComponentsConfigs.class));
}
public void writeConfigs() {
diff --git a/container-di/src/test/java/com/yahoo/container/di/ContainerTest.java b/container-di/src/test/java/com/yahoo/container/di/ContainerTest.java
index b8a5c7a236f..b596246a43d 100644
--- a/container-di/src/test/java/com/yahoo/container/di/ContainerTest.java
+++ b/container-di/src/test/java/com/yahoo/container/di/ContainerTest.java
@@ -394,11 +394,11 @@ public class ContainerTest extends ContainerTestBase {
}
ComponentGraph getNewComponentGraph(Container container, ComponentGraph oldGraph) {
- return container.getNewComponentGraph(oldGraph, Guice.createInjector());
+ return container.getNewComponentGraph(oldGraph, Guice.createInjector(), true);
}
ComponentGraph getNewComponentGraph(Container container) {
- return container.getNewComponentGraph(new ComponentGraph(), Guice.createInjector());
+ return container.getNewComponentGraph(new ComponentGraph(), Guice.createInjector(), true);
}
private ComponentTakingConfig createComponentTakingConfig(ComponentGraph componentGraph) {
diff --git a/container-di/src/test/java/com/yahoo/container/di/ContainerTestBase.java b/container-di/src/test/java/com/yahoo/container/di/ContainerTestBase.java
index 815865536f0..2106a1f3671 100644
--- a/container-di/src/test/java/com/yahoo/container/di/ContainerTestBase.java
+++ b/container-di/src/test/java/com/yahoo/container/di/ContainerTestBase.java
@@ -23,6 +23,7 @@ import static java.util.Collections.emptySet;
* @author ollivir
*/
public class ContainerTestBase {
+
private ComponentGraph componentGraph;
protected DirConfigSource dirConfigSource = null;
@@ -70,7 +71,7 @@ public class ContainerTestBase {
throw new UnsupportedOperationException("getBundle not supported.");
}
});
- componentGraph = container.getNewComponentGraph(componentGraph, Guice.createInjector());
+ componentGraph = container.getNewComponentGraph(componentGraph, Guice.createInjector(), true);
} catch (Exception e) {
throw new RuntimeException(e);
}
@@ -120,4 +121,5 @@ public class ContainerTestBase {
"</config>";
}
}
+
}