summaryrefslogtreecommitdiffstats
path: root/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
diff options
context:
space:
mode:
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.java33
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;