diff options
author | Harald Musum <musum@yahooinc.com> | 2021-12-03 13:31:03 +0100 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2021-12-03 13:31:03 +0100 |
commit | 40fad69acd84bd751fa4a2b533b07fe08602978c (patch) | |
tree | aad33ac242b956814e5588f50b27799718ec040d /config/src/main/java/com/yahoo | |
parent | aa0376715ca4590f8b4c2a3e10b4f659e5eacf8d (diff) |
Cleanup use of requesters and config sources
Remove requesters() method from ConfigSubscriber as well, not useful
for others and is documented as for internal use only
Diffstat (limited to 'config/src/main/java/com/yahoo')
6 files changed, 60 insertions, 62 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 07132c460f9..01008f0a8a2 100644 --- a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java +++ b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java @@ -5,15 +5,13 @@ 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; @@ -40,6 +38,7 @@ 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; @@ -52,11 +51,6 @@ 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. * */ @@ -114,8 +108,8 @@ public class ConfigSubscriber implements AutoCloseable { // for testing <T extends ConfigInstance> ConfigHandle<T> subscribe(Class<T> configClass, String configId, ConfigSource source, TimingValues timingValues) { checkStateBeforeSubscribe(); - final ConfigKey<T> configKey = new ConfigKey<>(configClass, configId); - ConfigSubscription<T> sub = ConfigSubscription.get(configKey, this, source, timingValues); + ConfigKey<T> configKey = new ConfigKey<>(configClass, configId); + ConfigSubscription<T> sub = ConfigSubscription.get(configKey, requesters, source, timingValues); ConfigHandle<T> handle = new ConfigHandle<>(sub); subscribeAndHandleErrors(sub, configKey, handle, timingValues); return handle; @@ -375,19 +369,10 @@ public class ConfigSubscriber implements AutoCloseable { for (ConfigHandle<? extends ConfigInstance> h : subscriptionHandles) { h.subscription().close(); } - closeRequesters(); + requesters.close(); 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(); @@ -442,14 +427,6 @@ 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 780556e93fa..f8a45a11b70 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,10 +111,9 @@ 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, ConfigSubscriber subscriber, + public static <T extends ConfigInstance> ConfigSubscription<T> get(ConfigKey<T> key, JrtConfigRequesters requesters, ConfigSource source, TimingValues timingValues) { String configId = key.getConfigId(); if (source instanceof RawSource || configId.startsWith("raw:")) return getRawSub(key, source); @@ -122,7 +121,10 @@ 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) return new JRTConfigSubscription<>(key, subscriber, (ConfigSourceSet) source, timingValues); + if (source instanceof ConfigSourceSet) { + JRTConfigRequester requester = requesters.getRequester((ConfigSourceSet) source, timingValues); + return new JRTConfigSubscription<>(key, requester, 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 6dc18137639..e382bab576e 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,14 +3,12 @@ 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. @@ -19,16 +17,18 @@ import java.util.Map; */ 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 requesters a map from config source set to config requester + * @param requester a config requester */ - public GenericConfigSubscriber(Map<ConfigSourceSet, JRTConfigRequester> requesters) { - this.requesters = requesters; + public GenericConfigSubscriber(JRTConfigRequester requester) { + this.requester = requester; } /** @@ -36,13 +36,12 @@ 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, ConfigSourceSet source, TimingValues timingValues) { + public GenericConfigHandle subscribe(ConfigKey<RawConfig> key, List<String> defContent, TimingValues timingValues) { checkStateBeforeSubscribe(); - GenericJRTConfigSubscription sub = new GenericJRTConfigSubscription(key, defContent, this, source, timingValues); + GenericJRTConfigSubscription sub = new GenericJRTConfigSubscription(key, defContent, requester, 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 737ca64b075..43f7a1fc168 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,8 +1,6 @@ // 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; @@ -25,10 +23,9 @@ public class GenericJRTConfigSubscription extends JRTConfigSubscription<RawConfi public GenericJRTConfigSubscription(ConfigKey<RawConfig> key, List<String> defContent, - ConfigSubscriber subscriber, - ConfigSourceSet source, + JRTConfigRequester requester, TimingValues timingValues) { - super(key, subscriber, source, timingValues); + super(key, requester, 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 b27c75fb61d..0b98e9cd1b2 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,8 +4,6 @@ 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; @@ -31,9 +29,8 @@ import static java.util.logging.Level.INFO; */ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubscription<T> { - private JRTConfigRequester requester; + private final JRTConfigRequester requester; private final TimingValues timingValues; - private final ConfigSubscriber subscriber; // Last time we got an OK JRT callback private Instant lastOK = Instant.MIN; @@ -43,13 +40,11 @@ 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, ConfigSubscriber subscriber, ConfigSourceSet source, TimingValues timingValues) { + public JRTConfigSubscription(ConfigKey<T> key, JRTConfigRequester requester, TimingValues timingValues) { super(key); this.timingValues = timingValues; - this.subscriber = subscriber; - this.sources = source; + this.requester = requester; } @Override @@ -148,7 +143,6 @@ 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))))) { @@ -162,15 +156,6 @@ 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 new file mode 100644 index 00000000000..1e9612272d5 --- /dev/null +++ b/config/src/main/java/com/yahoo/config/subscription/impl/JrtConfigRequesters.java @@ -0,0 +1,38 @@ +// 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); + } + +} |