summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2022-04-19 13:01:37 +0200
committerGitHub <noreply@github.com>2022-04-19 13:01:37 +0200
commit1e4a7bd6c22f52d7c6cd57b6f48dbfa5a89388b5 (patch)
treeb778eb16fabbbb0bddda88f30c0d67282dab13f5 /config
parente68794075a13959bf5011fa272277f483d65978e (diff)
parent2a682aeabfae08df0532fa9407deec0302932711 (diff)
Merge pull request #22113 from vespa-engine/hmusum/change-log-level-add-explanation
Warn if config changes without generation changing
Diffstat (limited to 'config')
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java4
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigRequester.java4
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigSubscription.java14
3 files changed, 17 insertions, 5 deletions
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 caa11b211ac..5d720a74b15 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
@@ -206,7 +206,9 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
int sizeHint = 500;
log.log(Level.WARNING, "Config has changed unexpectedly for " + key + ", generation " + generation +
", config in state :" + generator.makeSnippet(previousConfig.toString(), sizeHint) + ", new config: " +
- generator.makeSnippet(config.toString(), sizeHint));
+ generator.makeSnippet(config.toString(), sizeHint) +
+ ". This likely happened because config changed on a previous generation" +
+ ", look for earlier entry in log with warning about config changing without a change in config generation.");
}
this.config.set(new ConfigState<>(true, generation, applyOnRestart, configChanged, config, payloadChecksums));
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigRequester.java b/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigRequester.java
index 604c85555db..e86948fb3ae 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigRequester.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/JRTConfigRequester.java
@@ -194,9 +194,7 @@ public class JRTConfigRequester implements RequestWaiter {
failures = 0;
sub.setLastCallBackOKTS(Instant.now());
log.log(FINE, () -> "OK response received in handleOkRequest: " + jrtReq);
- if (jrtReq.hasUpdatedGeneration()) {
- sub.updateConfig(jrtReq);
- }
+ sub.updateConfig(jrtReq);
scheduleNextRequest(jrtReq, sub, calculateSuccessDelay(), calculateSuccessTimeout());
}
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 abfbf2c6c79..653df26bb53 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,6 +4,7 @@ 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.text.internal.SnippetGenerator;
import com.yahoo.vespa.config.ConfigKey;
import com.yahoo.vespa.config.ConfigPayload;
import com.yahoo.vespa.config.TimingValues;
@@ -16,6 +17,7 @@ import java.time.Instant;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
import static com.yahoo.vespa.config.PayloadChecksum.Type.MD5;
import static java.util.logging.Level.FINE;
@@ -63,6 +65,16 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
} else {
setNewConfigAndGeneration(response);
}
+ } else if (response.hasUpdatedConfig()) {
+ SnippetGenerator generator = new SnippetGenerator();
+ int sizeHint = 500;
+ T config = toConfigInstance(response);
+ log.log(Level.WARNING, "Config " + key + " has changed without a change in config generation: generation " +
+ response.getNewGeneration() + ", config: " + generator.makeSnippet(config.toString(), sizeHint) +
+ ". This might happen when a newly upgraded config server responds with different config when bootstrapping " +
+ " (changes to code generating config that are different between versions) or non-deterministic config generation" +
+ " (e.g. when using collections with non-deterministic iteration order)");
+ setNewConfigAndGeneration(response);
}
return newConfigOrException();
@@ -141,7 +153,7 @@ public class JRTConfigSubscription<T extends ConfigInstance> extends ConfigSubsc
return configInstance;
}
- // Called by JRTConfigRequester when there is a config with new generation for this subscription
+ // Called by JRTConfigRequester when there is a config response for this subscription
void updateConfig(JRTClientConfigRequest jrtReq) {
if ( ! responseQueue.offer(jrtReq))
setException(new ConfigurationRuntimeException("Failed offering returned request to queue of subscription " + this));