diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-02-15 13:36:15 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2018-02-15 13:36:15 +0100 |
commit | 7f546ef32133c12ad81e9be469977f2f7aaaf869 (patch) | |
tree | 139e14cd2dc41625860d2aede60516c9a4d40f6c /config | |
parent | f44e03ecc977708bd7ee76712a165414c5b192d1 (diff) |
Ensure that updates of generation are atomic.
Diffstat (limited to 'config')
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 { |