aboutsummaryrefslogtreecommitdiffstats
path: root/config/src/main/java/com/yahoo
diff options
context:
space:
mode:
Diffstat (limited to 'config/src/main/java/com/yahoo')
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java33
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java8
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/GenericConfigSubscriber.java15
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java7
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java21
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JrtConfigRequesters.java38
6 files changed, 62 insertions, 60 deletions
diff --git a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
index 01008f0a8a2..07132c460f9 100644
--- a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
+++ b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
@@ -5,13 +5,15 @@ import com.yahoo.config.ConfigInstance;
import com.yahoo.config.ConfigurationRuntimeException;
import com.yahoo.config.subscription.impl.ConfigSubscription;
import com.yahoo.config.subscription.impl.JRTConfigRequester;
-import com.yahoo.config.subscription.impl.JrtConfigRequesters;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.TimingValues;
import com.yahoo.yolean.Exceptions;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
+
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -38,7 +40,6 @@ public class ConfigSubscriber implements AutoCloseable {
private final ConfigSource source;
private final Object monitor = new Object();
private final Throwable stackTraceAtConstruction; // TODO Remove once finalizer is gone
- private final JrtConfigRequesters requesters = new JrtConfigRequesters();
/** The last complete config generation received by this */
private long generation = -1;
@@ -51,6 +52,11 @@ public class ConfigSubscriber implements AutoCloseable {
private boolean applyOnRestart = false;
/**
+ * Reuse requesters for equal source sets, limit number if many subscriptions.
+ */
+ protected Map<ConfigSourceSet, JRTConfigRequester> requesters = new HashMap<>();
+
+ /**
* The states of the subscriber. Affects the validity of calling certain methods.
*
*/
@@ -108,8 +114,8 @@ public class ConfigSubscriber implements AutoCloseable {
// for testing
<T extends ConfigInstance> ConfigHandle<T> subscribe(Class<T> configClass, String configId, ConfigSource source, TimingValues timingValues) {
checkStateBeforeSubscribe();
- ConfigKey<T> configKey = new ConfigKey<>(configClass, configId);
- ConfigSubscription<T> sub = ConfigSubscription.get(configKey, requesters, source, timingValues);
+ final ConfigKey<T> configKey = new ConfigKey<>(configClass, configId);
+ ConfigSubscription<T> sub = ConfigSubscription.get(configKey, this, source, timingValues);
ConfigHandle<T> handle = new ConfigHandle<>(sub);
subscribeAndHandleErrors(sub, configKey, handle, timingValues);
return handle;
@@ -369,10 +375,19 @@ public class ConfigSubscriber implements AutoCloseable {
for (ConfigHandle<? extends ConfigInstance> h : subscriptionHandles) {
h.subscription().close();
}
- requesters.close();
+ closeRequesters();
log.log(FINE, () -> "Config subscriber has been closed.");
}
+ /**
+ * Closes all open requesters
+ */
+ protected void closeRequesters() {
+ for (JRTConfigRequester requester : requesters.values()) {
+ requester.close();
+ }
+ }
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@@ -427,6 +442,14 @@ public class ConfigSubscriber implements AutoCloseable {
return source;
}
+ /**
+ * Implementation detail, do not use.
+ * @return requesters
+ */
+ public Map<ConfigSourceSet, JRTConfigRequester> requesters() {
+ return requesters;
+ }
+
public boolean isClosed() {
synchronized (monitor) {
return state == State.CLOSED;
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 f8a45a11b70..780556e93fa 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
@@ -111,9 +111,10 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
* Correct type of ConfigSubscription instance based on type of source or form of config id
*
* @param key a {@link ConfigKey}
+ * @param subscriber the subscriber for this subscription
* @return a subclass of a ConfigsSubscription
*/
- public static <T extends ConfigInstance> ConfigSubscription<T> get(ConfigKey<T> key, JrtConfigRequesters requesters,
+ public static <T extends ConfigInstance> ConfigSubscription<T> get(ConfigKey<T> key, ConfigSubscriber subscriber,
ConfigSource source, TimingValues timingValues) {
String configId = key.getConfigId();
if (source instanceof RawSource || configId.startsWith("raw:")) return getRawSub(key, source);
@@ -121,10 +122,7 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
if (source instanceof DirSource || configId.startsWith("dir:")) return getDirFileSub(key, source);
if (source instanceof JarSource || configId.startsWith("jar:")) return getJarSub(key, source);
if (source instanceof ConfigSet) return new ConfigSetSubscription<>(key, source);
- if (source instanceof ConfigSourceSet) {
- JRTConfigRequester requester = requesters.getRequester((ConfigSourceSet) source, timingValues);
- return new JRTConfigSubscription<>(key, requester, timingValues);
- }
+ if (source instanceof ConfigSourceSet) return new JRTConfigSubscription<>(key, subscriber, (ConfigSourceSet) source, timingValues);
throw new IllegalArgumentException("Unknown source type: " + source);
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/GenericConfigSubscriber.java b/config/src/main/java/com/yahoo/config/subscription/impl/GenericConfigSubscriber.java
index e382bab576e..6dc18137639 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/GenericConfigSubscriber.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/GenericConfigSubscriber.java
@@ -3,12 +3,14 @@ package com.yahoo.config.subscription.impl;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.subscription.ConfigHandle;
+import com.yahoo.config.subscription.ConfigSourceSet;
import com.yahoo.config.subscription.ConfigSubscriber;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.RawConfig;
import com.yahoo.vespa.config.TimingValues;
import java.util.List;
+import java.util.Map;
/**
* A subscriber that can subscribe without the class. Used by config proxy.
@@ -17,18 +19,16 @@ import java.util.List;
*/
public class GenericConfigSubscriber extends ConfigSubscriber {
- private final JRTConfigRequester requester;
-
/**
* Constructs a new subscriber using the given pool of requesters (JRTConfigRequester holds 1 connection which in
* turn is subject to failover across the elements in the source set.)
* The behaviour is undefined if the map key is different from the source set the requester was built with.
* See also {@link JRTConfigRequester#JRTConfigRequester(com.yahoo.vespa.config.ConnectionPool, com.yahoo.vespa.config.TimingValues)}
*
- * @param requester a config requester
+ * @param requesters a map from config source set to config requester
*/
- public GenericConfigSubscriber(JRTConfigRequester requester) {
- this.requester = requester;
+ public GenericConfigSubscriber(Map<ConfigSourceSet, JRTConfigRequester> requesters) {
+ this.requesters = requesters;
}
/**
@@ -36,12 +36,13 @@ public class GenericConfigSubscriber extends ConfigSubscriber {
*
* @param key the {@link ConfigKey to subscribe to}
* @param defContent the config definition content for the config to subscribe to
+ * @param source the config source to use
* @param timingValues {@link TimingValues}
* @return generic handle
*/
- public GenericConfigHandle subscribe(ConfigKey<RawConfig> key, List<String> defContent, TimingValues timingValues) {
+ public GenericConfigHandle subscribe(ConfigKey<RawConfig> key, List<String> defContent, ConfigSourceSet source, TimingValues timingValues) {
checkStateBeforeSubscribe();
- GenericJRTConfigSubscription sub = new GenericJRTConfigSubscription(key, defContent, requester, timingValues);
+ GenericJRTConfigSubscription sub = new GenericJRTConfigSubscription(key, defContent, this, source, timingValues);
GenericConfigHandle handle = new GenericConfigHandle(sub);
subscribeAndHandleErrors(sub, key, handle, timingValues);
return handle;
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java
index 43f7a1fc168..737ca64b075 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java
@@ -1,6 +1,8 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.subscription.impl;
+import com.yahoo.config.subscription.ConfigSourceSet;
+import com.yahoo.config.subscription.ConfigSubscriber;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.RawConfig;
import com.yahoo.vespa.config.TimingValues;
@@ -23,9 +25,10 @@ public class GenericJRTConfigSubscription extends JRTConfigSubscription<RawConfi
public GenericJRTConfigSubscription(ConfigKey<RawConfig> key,
List<String> defContent,
- JRTConfigRequester requester,
+ ConfigSubscriber subscriber,
+ ConfigSourceSet source,
TimingValues timingValues) {
- super(key, requester, timingValues);
+ super(key, subscriber, source, timingValues);
this.defContent = defContent;
}
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 0b98e9cd1b2..b27c75fb61d 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
@@ -4,6 +4,8 @@ package com.yahoo.config.subscription.impl;
import com.yahoo.config.ConfigInstance;
import com.yahoo.config.ConfigurationRuntimeException;
import com.yahoo.config.subscription.ConfigInterruptedException;
+import com.yahoo.config.subscription.ConfigSourceSet;
+import com.yahoo.config.subscription.ConfigSubscriber;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.ConfigPayload;
import com.yahoo.vespa.config.TimingValues;
@@ -29,8 +31,9 @@ import static java.util.logging.Level.INFO;
*/
public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubscription<T> {
- private final JRTConfigRequester requester;
+ private JRTConfigRequester requester;
private final TimingValues timingValues;
+ private final ConfigSubscriber subscriber;
// Last time we got an OK JRT callback
private Instant lastOK = Instant.MIN;
@@ -40,11 +43,13 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
* but has not yet been handled.
*/
private BlockingQueue<JRTClientConfigRequest> reqQueue = new LinkedBlockingQueue<>();
+ private final ConfigSourceSet sources;
- public JRTConfigSubscription(ConfigKey<T> key, JRTConfigRequester requester, TimingValues timingValues) {
+ public JRTConfigSubscription(ConfigKey<T> key, ConfigSubscriber subscriber, ConfigSourceSet source, TimingValues timingValues) {
super(key);
this.timingValues = timingValues;
- this.requester = requester;
+ this.subscriber = subscriber;
+ this.sources = source;
}
@Override
@@ -143,6 +148,7 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
@Override
public boolean subscribe(long timeout) {
lastOK = Instant.now();
+ requester = getRequester();
requester.request(this);
JRTClientConfigRequest req = reqQueue.peek();
while (req == null && (Instant.now().isBefore(lastOK.plus(Duration.ofMillis(timeout))))) {
@@ -156,6 +162,15 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
return req != null;
}
+ private JRTConfigRequester getRequester() {
+ JRTConfigRequester requester = subscriber.requesters().get(sources);
+ if (requester == null) {
+ requester = JRTConfigRequester.create(sources, timingValues);
+ subscriber.requesters().put(sources, requester);
+ }
+ return requester;
+ }
+
@Override
@SuppressWarnings("serial")
public void close() {
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/JrtConfigRequesters.java b/config/src/main/java/com/yahoo/config/subscription/impl/JrtConfigRequesters.java
deleted file mode 100644
index 1e9612272d5..00000000000
--- a/config/src/main/java/com/yahoo/config/subscription/impl/JrtConfigRequesters.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.config.subscription.impl;
-
-import com.yahoo.config.subscription.ConfigSourceSet;
-import com.yahoo.vespa.config.TimingValues;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Keeps track of requesters per config subscriber
- *
- * @author hmusum
- */
-public class JrtConfigRequesters {
-
- /**
- * Reuse requesters for equal source sets, limit number if many subscriptions.
- */
- protected Map<ConfigSourceSet, JRTConfigRequester> requesters = new HashMap<>();
-
- public JRTConfigRequester getRequester(ConfigSourceSet source, TimingValues timingValues) {
- JRTConfigRequester requester = requesters.get(source);
- if (requester == null) {
- requester = JRTConfigRequester.create(source, timingValues);
- requesters.put(source, requester);
- }
- return requester;
- }
-
- /**
- * Closes all open requesters
- */
- public void close() {
- requesters.values().forEach(JRTConfigRequester::close);
- }
-
-}