diff options
Diffstat (limited to 'config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java')
-rw-r--r-- | config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java | 33 |
1 files changed, 28 insertions, 5 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; |