summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-02-15 13:36:15 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2018-02-15 13:36:15 +0100
commit7f546ef32133c12ad81e9be469977f2f7aaaf869 (patch)
tree139e14cd2dc41625860d2aede60516c9a4d40f6c /config
parentf44e03ecc977708bd7ee76712a165414c5b192d1 (diff)
Ensure that updates of generation are atomic.
Diffstat (limited to 'config')
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSetSubscription.java9
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/ConfigSubscription.java13
-rw-r--r--config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java5
3 files changed, 19 insertions, 8 deletions
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSetSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSetSubscription.java
index c09dc4d2dd7..204284e22d0 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSetSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/ConfigSetSubscription.java
@@ -37,14 +37,13 @@ public class ConfigSetSubscription<T extends ConfigInstance> extends ConfigSubsc
do {
ConfigInstance myInstance = getNewInstance();
ConfigState<T> configState = getConfigState();
- Long nextGen = configState.getGeneration() + 1;
// User forced reload
if (checkReloaded()) {
- updateInstance(nextGen, myInstance);
+ updateInstance(myInstance);
return true;
}
if (!myInstance.equals(configState.getConfig())) {
- updateInstance(nextGen, myInstance);
+ updateInstance(myInstance);
return true;
}
sleep();
@@ -61,8 +60,8 @@ public class ConfigSetSubscription<T extends ConfigInstance> extends ConfigSubsc
}
@SuppressWarnings("unchecked")
- private void updateInstance(Long generation, ConfigInstance myInstance) {
- setConfigIfChanged(generation, (T)myInstance);
+ private void updateInstance(ConfigInstance myInstance) {
+ setConfigIfChangedIncGen((T)myInstance);
}
@Override
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 4573f4bdbc2..1da0f640ec7 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
@@ -175,6 +175,19 @@ public abstract class ConfigSubscription<T extends ConfigInstance> {
this.config.set(new ConfigState<>(true, generation, true, config));
}
+ void setConfigIncGen(T config) {
+ ConfigState<T> prev = this.config.get();
+ while ( !this.config.compareAndSet(prev, new ConfigState<>(true, prev.getGeneration()+1, true, config))) {
+ prev = this.config.get();
+ }
+ }
+
+ void setConfigIfChangedIncGen(T config) {
+ ConfigState<T> prev = this.config.get();
+ while (!this.config.compareAndSet(prev, new ConfigState<>(true, prev.getGeneration() + 1, !config.equals(prev.getConfig()), config))) {
+ prev = this.config.get();
+ }
+ }
void setConfigIfChanged(Long generation, T config) {
this.config.set(new ConfigState<>(true, generation, !config.equals(this.config.get().getConfig()), config));
}
diff --git a/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java b/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java
index e2e7bc1d2a0..43c5e9a87f8 100644
--- a/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java
+++ b/config/src/main/java/com/yahoo/config/subscription/impl/FileConfigSubscription.java
@@ -37,19 +37,18 @@ public class FileConfigSubscription<T extends ConfigInstance> extends ConfigSubs
@Override
public boolean nextConfig(long timeout) {
if (!file.exists() && !file.isFile()) throw new IllegalArgumentException("Not a file: "+file);
- Long nextGen = getConfigState().getGeneration() + 1;
if (checkReloaded()) {
log.log(LogLevel.DEBUG, "User forced config reload at " + System.currentTimeMillis());
// User forced reload
T newConfig = updateConfig();
- setConfigIfChanged(nextGen, updateConfig());
+ setConfigIfChangedIncGen(updateConfig());
ConfigState<T> configState = getConfigState();
log.log(LogLevel.DEBUG, "Config updated at " + System.currentTimeMillis() + ", changed: " + configState.isConfigChanged());
log.log(LogLevel.DEBUG, "Config: " + configState.getConfig().toString());
return true;
}
if (file.lastModified()!=ts) {
- setConfig(nextGen, updateConfig());
+ setConfigIncGen(updateConfig());
return true;
}
try {