predicate -> consumer

This commit is contained in:
Simon Willnauer 2015-12-09 10:14:33 +01:00
parent c9d7c92243
commit d4e7bd2cc3
6 changed files with 21 additions and 22 deletions

View File

@ -155,7 +155,7 @@ public abstract class AbstractScopedSettings extends AbstractComponent {
* Note: Only settings registered in {@link org.elasticsearch.cluster.ClusterModule} can be changed dynamically.
* </p>
*/
public synchronized <T> void addSettingsUpdateConsumer(Setting<T> setting, Consumer<T> consumer, Predicate<T> predicate) {
public synchronized <T> void addSettingsUpdateConsumer(Setting<T> setting, Consumer<T> consumer, Consumer<T> predicate) {
if (setting != get(setting.getKey())) {
throw new IllegalArgumentException("Setting is not registered for key [" + setting.getKey() + "]");
}
@ -167,6 +167,8 @@ public abstract class AbstractScopedSettings extends AbstractComponent {
* <p>
* Note: Only settings registered in {@link org.elasticsearch.cluster.ClusterModule} can be changed dynamically.
* </p>
* This method registers a compound updater that is useful if two settings are depending on each other. The consumer is always provided
* with both values even if only one of the two changes.
*/
public synchronized <A, B> void addSettingsUpdateConsumer(Setting<A> a, Setting<B> b, BiConsumer<A, B> consumer) {
if (a != get(a.getKey())) {
@ -185,7 +187,7 @@ public abstract class AbstractScopedSettings extends AbstractComponent {
* </p>
*/
public synchronized <T> void addSettingsUpdateConsumer(Setting<T> setting, Consumer<T> consumer) {
addSettingsUpdateConsumer(setting, consumer, (s) -> true);
addSettingsUpdateConsumer(setting, consumer, (s) -> {});
}
/**
@ -238,7 +240,7 @@ public abstract class AbstractScopedSettings extends AbstractComponent {
}
/**
* Returns a settings object that contains all clustersettings that are not
* Returns a settings object that contains all settings that are not
* already set in the given source. The diff contains either the default value for each
* setting or the settings value in the given default settings.
*/

View File

@ -150,10 +150,10 @@ public class Setting<T> extends ToXContentToBytes {
}
AbstractScopedSettings.SettingUpdater newUpdater(Consumer<T> consumer, ESLogger logger, Settings settings) {
return newUpdater(consumer, logger, settings, (s) -> true);
return newUpdater(consumer, logger, settings, (s) -> {});
}
AbstractScopedSettings.SettingUpdater newUpdater(Consumer<T> consumer, ESLogger logger, Settings settings, Predicate<T> accept) {
AbstractScopedSettings.SettingUpdater newUpdater(Consumer<T> consumer, ESLogger logger, Settings settings, Consumer<T> accept) {
if (isDynamic()) {
return new Updater(consumer, logger, settings, accept);
} else {
@ -207,13 +207,13 @@ public class Setting<T> extends ToXContentToBytes {
private class Updater implements AbstractScopedSettings.SettingUpdater {
private final Consumer<T> consumer;
private final ESLogger logger;
private final Predicate<T> accept;
private final Consumer<T> accept;
private String value;
private boolean commitPending;
private String pendingValue;
private T valueInstance;
public Updater(Consumer<T> consumer, ESLogger logger, Settings settings, Predicate<T> accept) {
public Updater(Consumer<T> consumer, ESLogger logger, Settings settings, Consumer<T> accept) {
this.consumer = consumer;
this.logger = logger;
value = getRaw(settings);
@ -228,8 +228,10 @@ public class Setting<T> extends ToXContentToBytes {
}
if (value.equals(newValue) == false) {
T inst = get(settings);
if (accept.test(inst) == false) {
throw new IllegalArgumentException("illegal value can't update [" + key + "] from [" + value + "] to [" + getRaw(settings) + "]");
try {
accept.accept(inst);
} catch (Exception | AssertionError e) {
throw new IllegalArgumentException("illegal value can't update [" + key + "] from [" + value + "] to [" + getRaw(settings) + "]", e);
}
pendingValue = newValue;
valueInstance = inst;
@ -325,7 +327,7 @@ public class Setting<T> extends ToXContentToBytes {
}
@Override
public AbstractScopedSettings.SettingUpdater newUpdater(Consumer<Settings> consumer, ESLogger logger, Settings settings, Predicate<Settings> accept) {
public AbstractScopedSettings.SettingUpdater newUpdater(Consumer<Settings> consumer, ESLogger logger, Settings settings, Consumer<Settings> accept) {
if (isDynamic() == false) {
throw new IllegalStateException("setting [" + getKey() + "] is not dynamic");
}
@ -338,8 +340,10 @@ public class Setting<T> extends ToXContentToBytes {
public boolean prepareApply(Settings settings) {
Settings currentSettings = get(settings);
if (currentSettings.equals(committedSettings) == false) {
if (accept.test(currentSettings) == false) {
throw new IllegalArgumentException("illegal value can't update [" + key + "] from [" + committedSettings.getAsMap() + "] to [" + currentSettings.getAsMap() + "]");
try {
accept.accept(currentSettings);
} catch (Exception | AssertionError e) {
throw new IllegalArgumentException("illegal value can't update [" + key + "] from [" + committedSettings.getAsMap() + "] to [" + currentSettings.getAsMap() + "]", e);
}
pendingSettings = currentSettings;
return true;

View File

@ -178,7 +178,6 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
if (value > masterNodes) {
throw new IllegalArgumentException("cannot set " + ElectMasterService.DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey() + " to more than the current master nodes count [" + masterNodes + "]");
}
return true;
});
clusterSettings.addSettingsUpdateConsumer(REJOIN_ON_MASTER_GONE_SETTING, this::setRejoingOnMasterGone);

View File

@ -252,7 +252,7 @@ public class ThreadPool extends AbstractComponent {
public void setNodeSettingsService(ClusterSettings clusterSettings) {
if(settingsListenerIsSet.compareAndSet(false, true)) {
clusterSettings.addSettingsUpdateConsumer(THREADPOOL_GROUP_SETTING, this::updateSettings, (s) -> {validate(s.getAsGroups()); return true;});
clusterSettings.addSettingsUpdateConsumer(THREADPOOL_GROUP_SETTING, this::updateSettings, (s) -> validate(s.getAsGroups()));
} else {
throw new IllegalStateException("the node settings listener was set more then once");
}

View File

@ -66,7 +66,7 @@ public class ScopedSettingsTests extends ESTestCase {
AtomicInteger consumer = new AtomicInteger();
service.addSettingsUpdateConsumer(testSetting, consumer::set);
AtomicInteger consumer2 = new AtomicInteger();
service.addSettingsUpdateConsumer(testSetting2, consumer2::set, (s) -> s > 0);
service.addSettingsUpdateConsumer(testSetting2, consumer2::set, (s) -> assertTrue(s > 0));
AtomicInteger aC = new AtomicInteger();
AtomicInteger bC = new AtomicInteger();

View File

@ -209,7 +209,7 @@ public class SettingTests extends ESTestCase {
assertTrue(setting.match("foo.bar.baz"));
assertFalse(setting.match("foo.baz.bar"));
ClusterSettings.SettingUpdater predicateSettingUpdater = setting.newUpdater(ref::set, logger, Settings.EMPTY, (s) -> false);
ClusterSettings.SettingUpdater predicateSettingUpdater = setting.newUpdater(ref::set, logger, Settings.EMPTY, (s) -> assertFalse(true));
try {
predicateSettingUpdater.prepareApply(Settings.builder().put("foo.bar.1.value", "1").put("foo.bar.2.value", "2").build());
fail("not accepted");
@ -273,10 +273,4 @@ public class SettingTests extends ESTestCase {
assertEquals(1, c.b.intValue());
}
}