aboutsummaryrefslogtreecommitdiffstats
path: root/config/src/main/java/com/yahoo/config/subscription
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-12-02 07:53:44 +0100
committerJon Bratseth <bratseth@gmail.com>2020-12-02 07:53:44 +0100
commitd5982ee7479179b6754b1b9cd4cdbc8140c5e961 (patch)
tree721db18f73b48066dfe9ad4e18066ac2b7955b65 /config/src/main/java/com/yahoo/config/subscription
parent4cf13bc7db215e77f7688e429f700880c115fe76 (diff)
Revert "Merge pull request #15581 from vespa-engine/revert-15578-bratseth/apply-on-restart-take-10"
This reverts commit 4cf13bc7db215e77f7688e429f700880c115fe76, reversing changes made to e21f385bd4f21326608f3a69325df4e96d4a65e5.
Diffstat (limited to 'config/src/main/java/com/yahoo/config/subscription')
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java24
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java34
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/GenericJRTConfigSubscription.java14
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java3
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JarConfigSubscription.java2
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/MockConnection.java2
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/RawConfigSubscription.java2
7 files changed, 63 insertions, 18 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 6bfaa992eb1..ad131f8e0dd 100644
--- a/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
+++ b/config/src/main/java/com/yahoo/config/subscription/ConfigSubscriber.java
@@ -33,6 +33,7 @@ import static java.util.stream.Collectors.toList;
public class ConfigSubscriber implements AutoCloseable {
private static final Logger log = Logger.getLogger(ConfigSubscriber.class.getName());
+
private State state = State.OPEN;
protected final List<ConfigHandle<? extends ConfigInstance>> subscriptionHandles = new CopyOnWriteArrayList<>();
private final ConfigSource source;
@@ -46,6 +47,13 @@ public class ConfigSubscriber implements AutoCloseable {
private boolean internalRedeploy = false;
/**
+ * Whether the last generation should only be applied on restart, not immediately.
+ * Once this is set it will not be unset, as no future generation should be applied
+ * once there is a generation which require restart.
+ */
+ private boolean applyOnRestart = false;
+
+ /**
* Reuse requesters for equal source sets, limit number if many subscriptions.
*/
protected Map<ConfigSourceSet, JRTConfigRequester> requesters = new HashMap<>();
@@ -235,12 +243,15 @@ public class ConfigSubscriber implements AutoCloseable {
* @param timeoutInMillis timeout to wait in milliseconds
* @param requireChange if set, at least one config have to change
* @return true, if a new config generation has been found for all configs (additionally requires
- * that at lest one of them has changed if <code>requireChange</code> is true), false otherwise
+ * that at lest one of them has changed if <code>requireChange</code> is true), and
+ * the config should be applied at this time, false otherwise
*/
private boolean acquireSnapshot(long timeoutInMillis, boolean requireChange) {
+ boolean applyOnRestartOnly;
synchronized (monitor) {
if (state == State.CLOSED) return false;
state = State.FROZEN;
+ applyOnRestartOnly = applyOnRestart;
}
long started = System.currentTimeMillis();
long timeLeftMillis = timeoutInMillis;
@@ -269,9 +280,18 @@ public class ConfigSubscriber implements AutoCloseable {
allGenerationsChanged &= config.isGenerationChanged();
anyConfigChanged |= config.isConfigChanged();
internalRedeployOnly &= config.isInternalRedeploy();
+ applyOnRestartOnly |= requireChange && config.applyOnRestart(); // only if this is reconfig
timeLeftMillis = timeoutInMillis + started - System.currentTimeMillis();
}
- reconfigDue = (anyConfigChanged || !requireChange) && allGenerationsChanged && allGenerationsTheSame;
+ reconfigDue = ((anyConfigChanged && !applyOnRestartOnly) || !requireChange)
+ && allGenerationsChanged && allGenerationsTheSame;
+
+ if (requireChange && applyOnRestartOnly) { // if this is a reconfig, disable future reconfigs until restart
+ synchronized (monitor) {
+ applyOnRestart = applyOnRestartOnly;
+ }
+ }
+
if (!reconfigDue && timeLeftMillis > 0) {
sleep(timeLeftMillis);
}
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 3bf6093e872..15f6395c417 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
@@ -40,21 +40,28 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
private final T config;
private final Long generation;
private final boolean internalRedeploy;
-
- private ConfigState(boolean generationChanged, Long generation, boolean internalRedeploy, boolean configChanged, T config) {
+ private final boolean applyOnRestart;
+
+ private ConfigState(boolean generationChanged,
+ Long generation,
+ boolean internalRedeploy,
+ boolean applyOnRestart,
+ boolean configChanged,
+ T config) {
this.generationChanged = generationChanged;
this.generation = generation;
this.internalRedeploy = internalRedeploy;
+ this.applyOnRestart = applyOnRestart;
this.configChanged = configChanged;
this.config = config;
}
private ConfigState(Long generation, T config) {
- this(false, generation, false, false, config);
+ this(false, generation, false, false, false, config);
}
private ConfigState() {
- this(false, 0L, false, false, null);
+ this(false, 0L, false, false, false, null);
}
private ConfigState<T> createUnchanged() { return new ConfigState<>(generation, config); }
@@ -68,6 +75,8 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
*/
public boolean isInternalRedeploy() { return internalRedeploy; }
+ public boolean applyOnRestart() { return applyOnRestart; }
+
public T getConfig() { return config; }
}
@@ -181,29 +190,34 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
return !prev.getGeneration().equals(requiredGen) || prev.isConfigChanged();
}
- void setConfig(Long generation, boolean internalRedeploy, T config) {
- this.config.set(new ConfigState<>(true, generation, internalRedeploy, true, config));
+ void setConfig(Long generation, boolean internalRedeploy, boolean applyOnRestart, T config) {
+ this.config.set(new ConfigState<>(true, generation, internalRedeploy, applyOnRestart, true, config));
}
/** Used by {@link FileConfigSubscription} and {@link ConfigSetSubscription} */
protected void setConfigIncGen(T config) {
ConfigState<T> prev = this.config.get();
- this.config.set(new ConfigState<>(true, prev.getGeneration() + 1, prev.isInternalRedeploy(), true, config));
+ this.config.set(new ConfigState<>(true, prev.getGeneration() + 1, prev.isInternalRedeploy(), prev.applyOnRestart(), true, config));
}
protected void setConfigIfChanged(T config) {
ConfigState<T> prev = this.config.get();
- this.config.set(new ConfigState<>(true, prev.getGeneration(), prev.isInternalRedeploy(), !config.equals(prev.getConfig()), config));
+ this.config.set(new ConfigState<>(true, prev.getGeneration(), prev.isInternalRedeploy(), prev.applyOnRestart(), !config.equals(prev.getConfig()), config));
}
void setGeneration(Long generation) {
ConfigState<T> prev = config.get();
- this.config.set(new ConfigState<>(true, generation, prev.isInternalRedeploy(), prev.isConfigChanged(), prev.getConfig()));
+ this.config.set(new ConfigState<>(true, generation, prev.isInternalRedeploy(), prev.applyOnRestart(), prev.isConfigChanged(), prev.getConfig()));
}
void setInternalRedeploy(boolean internalRedeploy) {
ConfigState<T> prev = config.get();
- this.config.set(new ConfigState<>(prev.isGenerationChanged(), prev.getGeneration(), internalRedeploy, prev.isConfigChanged(), prev.getConfig()));
+ this.config.set(new ConfigState<>(prev.isGenerationChanged(), prev.getGeneration(), internalRedeploy, prev.applyOnRestart(), prev.isConfigChanged(), prev.getConfig()));
+ }
+
+ void setApplyOnRestart(boolean applyOnRestart) {
+ ConfigState<T> prev = config.get();
+ this.config.set(new ConfigState<>(prev.isGenerationChanged(), prev.getGeneration(), prev.isInternalRedeploy(), applyOnRestart, prev.isConfigChanged(), prev.getConfig()));
}
/**
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 eec18b93e71..ba8fc8a5e19 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
@@ -18,7 +18,6 @@ import static java.util.logging.Level.FINE;
* Used by config proxy.
*
* @author Vegard Havdal
- *
*/
public class GenericJRTConfigSubscription extends JRTConfigSubscription<RawConfig> {
@@ -33,7 +32,7 @@ public class GenericJRTConfigSubscription extends JRTConfigSubscription<RawConfi
@Override
protected void setNewConfig(JRTClientConfigRequest jrtReq) {
- setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsInternalRedeploy(), RawConfig.createFromResponseParameters(jrtReq) );
+ setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsInternalRedeploy(), jrtReq.responseIsApplyOnRestart(), RawConfig.createFromResponseParameters(jrtReq) );
log.log(FINE, () -> "in setNewConfig, config=" + this.getConfigState().getConfig());
}
@@ -60,6 +59,17 @@ public class GenericJRTConfigSubscription extends JRTConfigSubscription<RawConfi
}
}
+ // Override to propagate internal redeploy into the config value in addition to the config state
+ @Override
+ void setApplyOnRestart(boolean applyOnRestart) {
+ super.setApplyOnRestart(applyOnRestart);
+ ConfigState<RawConfig> configState = getConfigState();
+
+ if (configState.getConfig() != null) {
+ configState.getConfig().setApplyOnRestart(applyOnRestart);
+ }
+ }
+
public RawConfig getRawConfig() {
return getConfigState().getConfig();
}
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 44f6d65ee65..e9d5d317995 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
@@ -94,6 +94,7 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
log.log(FINE, () -> "Polled queue and found config " + jrtReq);
if (jrtReq.hasUpdatedGeneration()) {
setInternalRedeploy(jrtReq.responseIsInternalRedeploy());
+ setApplyOnRestart(jrtReq.responseIsApplyOnRestart());
if (jrtReq.hasUpdatedConfig()) {
setNewConfig(jrtReq);
} else {
@@ -111,7 +112,7 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
} catch (IllegalArgumentException e) {
badConfigE = e;
}
- setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsInternalRedeploy(), configInstance);
+ setConfig(jrtReq.getNewGeneration(), jrtReq.responseIsInternalRedeploy(), jrtReq.responseIsApplyOnRestart(), configInstance);
if (badConfigE != null) {
throw new IllegalArgumentException("Bad config from jrt", badConfigE);
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/JarConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/JarConfigSubscription.java
index 05da9a72837..9fc5d9d3300 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/JarConfigSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/JarConfigSubscription.java
@@ -63,7 +63,7 @@ public class JarConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
} catch (IOException e) {
throw new ConfigurationRuntimeException(e);
}
- setConfig(0L, false, config);
+ setConfig(0L, false, false, config);
try {
jarFile.close();
} catch (IOException e) {
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/MockConnection.java b/config/src/main/java/com/yahoo/config/subscription/impl/MockConnection.java
index 58eed7f9e78..3a284489109 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/MockConnection.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/MockConnection.java
@@ -115,7 +115,7 @@ public class MockConnection implements ConnectionPool, com.yahoo.vespa.config.Co
JRTServerConfigRequestV3 jrtReq = JRTServerConfigRequestV3.createFromRequest(request);
Payload payload = Payload.from(ConfigPayload.empty());
long generation = 1;
- jrtReq.addOkResponse(payload, generation, false, ConfigUtils.getMd5(payload.getData()));
+ jrtReq.addOkResponse(payload, generation, false, false, ConfigUtils.getMd5(payload.getData()));
}
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/RawConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/RawConfigSubscription.java
index 68ff6bb0135..1ff0a058a93 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/RawConfigSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/RawConfigSubscription.java
@@ -35,7 +35,7 @@ public class RawConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
if (payload == null) {
payload = inputPayload;
ConfigPayload configPayload = new CfgConfigPayloadBuilder().deserialize(Arrays.asList(payload.split("\n")));
- setConfig(0L, false, configPayload.toInstance(configClass, key.getConfigId()));
+ setConfig(0L, false, false, configPayload.toInstance(configClass, key.getConfigId()));
return true;
}
try {