diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-12-02 07:53:44 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-12-02 07:53:44 +0100 |
commit | d5982ee7479179b6754b1b9cd4cdbc8140c5e961 (patch) | |
tree | 721db18f73b48066dfe9ad4e18066ac2b7955b65 /config/src/main/java/com/yahoo/config/subscription | |
parent | 4cf13bc7db215e77f7688e429f700880c115fe76 (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')
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 { |