|
|
@@ -23,6 +23,7 @@ import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.FilterAllocationDecider;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.ShardsLimitAllocationDecider;
|
|
|
+import org.elasticsearch.common.collect.Tuple;
|
|
|
import org.elasticsearch.common.logging.ESLoggerFactory;
|
|
|
import org.elasticsearch.common.logging.Loggers;
|
|
|
import org.elasticsearch.common.settings.Setting.Property;
|
|
|
@@ -180,6 +181,99 @@ public class ScopedSettingsTests extends ESTestCase {
|
|
|
service.validate(Settings.builder().put("foo.test.bar", 7).build(), false);
|
|
|
}
|
|
|
|
|
|
+ public void testTupleAffixUpdateConsumer() {
|
|
|
+ String prefix = randomAlphaOfLength(3) + "foo.";
|
|
|
+ String intSuffix = randomAlphaOfLength(3);
|
|
|
+ String listSuffix = randomAlphaOfLength(4);
|
|
|
+ Setting.AffixSetting<Integer> intSetting = Setting.affixKeySetting(prefix, intSuffix,
|
|
|
+ (k) -> Setting.intSetting(k, 1, Property.Dynamic, Property.NodeScope));
|
|
|
+ Setting.AffixSetting<List<Integer>> listSetting = Setting.affixKeySetting(prefix, listSuffix,
|
|
|
+ (k) -> Setting.listSetting(k, Arrays.asList("1"), Integer::parseInt, Property.Dynamic, Property.NodeScope));
|
|
|
+ AbstractScopedSettings service = new ClusterSettings(Settings.EMPTY,new HashSet<>(Arrays.asList(intSetting, listSetting)));
|
|
|
+ Map<String, Tuple<List<Integer>, Integer>> results = new HashMap<>();
|
|
|
+ Function<String, String> listBuilder = g -> (prefix + g + "." + listSuffix);
|
|
|
+ Function<String, String> intBuilder = g -> (prefix + g + "." + intSuffix);
|
|
|
+ String group1 = randomAlphaOfLength(3);
|
|
|
+ String group2 = randomAlphaOfLength(4);
|
|
|
+ String group3 = randomAlphaOfLength(5);
|
|
|
+ BiConsumer<String, Tuple<List<Integer>, Integer>> listConsumer = results::put;
|
|
|
+
|
|
|
+ service.addAffixUpdateConsumer(listSetting, intSetting, listConsumer, (s, k) -> {
|
|
|
+ if (k.v1().isEmpty() && k.v2() == 2) {
|
|
|
+ throw new IllegalArgumentException("boom");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ assertEquals(0, results.size());
|
|
|
+ service.applySettings(Settings.builder()
|
|
|
+ .put(intBuilder.apply(group1), 2)
|
|
|
+ .put(intBuilder.apply(group2), 7)
|
|
|
+ .putList(listBuilder.apply(group1), "16", "17")
|
|
|
+ .putList(listBuilder.apply(group2), "18", "19", "20")
|
|
|
+ .build());
|
|
|
+ assertEquals(2, results.get(group1).v2().intValue());
|
|
|
+ assertEquals(7, results.get(group2).v2().intValue());
|
|
|
+ assertEquals(Arrays.asList(16, 17), results.get(group1).v1());
|
|
|
+ assertEquals(Arrays.asList(18, 19, 20), results.get(group2).v1());
|
|
|
+ assertEquals(2, results.size());
|
|
|
+
|
|
|
+ results.clear();
|
|
|
+
|
|
|
+ service.applySettings(Settings.builder()
|
|
|
+ .put(intBuilder.apply(group1), 2)
|
|
|
+ .put(intBuilder.apply(group2), 7)
|
|
|
+ .putList(listBuilder.apply(group1), "16", "17")
|
|
|
+ .putNull(listBuilder.apply(group2)) // removed
|
|
|
+ .build());
|
|
|
+
|
|
|
+ assertNull(group1 + " wasn't changed", results.get(group1));
|
|
|
+ assertEquals(1, results.get(group2).v1().size());
|
|
|
+ assertEquals(Arrays.asList(1), results.get(group2).v1());
|
|
|
+ assertEquals(7, results.get(group2).v2().intValue());
|
|
|
+ assertEquals(1, results.size());
|
|
|
+ results.clear();
|
|
|
+
|
|
|
+ service.applySettings(Settings.builder()
|
|
|
+ .put(intBuilder.apply(group1), 2)
|
|
|
+ .put(intBuilder.apply(group2), 7)
|
|
|
+ .putList(listBuilder.apply(group1), "16", "17")
|
|
|
+ .putList(listBuilder.apply(group3), "5", "6") // added
|
|
|
+ .build());
|
|
|
+ assertNull(group1 + " wasn't changed", results.get(group1));
|
|
|
+ assertNull(group2 + " wasn't changed", results.get(group2));
|
|
|
+
|
|
|
+ assertEquals(2, results.get(group3).v1().size());
|
|
|
+ assertEquals(Arrays.asList(5, 6), results.get(group3).v1());
|
|
|
+ assertEquals(1, results.get(group3).v2().intValue());
|
|
|
+ assertEquals(1, results.size());
|
|
|
+ results.clear();
|
|
|
+
|
|
|
+ service.applySettings(Settings.builder()
|
|
|
+ .put(intBuilder.apply(group1), 4) // modified
|
|
|
+ .put(intBuilder.apply(group2), 7)
|
|
|
+ .putList(listBuilder.apply(group1), "16", "17")
|
|
|
+ .putList(listBuilder.apply(group3), "5", "6")
|
|
|
+ .build());
|
|
|
+ assertNull(group2 + " wasn't changed", results.get(group2));
|
|
|
+ assertNull(group3 + " wasn't changed", results.get(group3));
|
|
|
+
|
|
|
+ assertEquals(2, results.get(group1).v1().size());
|
|
|
+ assertEquals(Arrays.asList(16, 17), results.get(group1).v1());
|
|
|
+ assertEquals(4, results.get(group1).v2().intValue());
|
|
|
+ assertEquals(1, results.size());
|
|
|
+ results.clear();
|
|
|
+
|
|
|
+ IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () ->
|
|
|
+ service.applySettings(Settings.builder()
|
|
|
+ .put(intBuilder.apply(group1), 2) // modified to trip validator
|
|
|
+ .put(intBuilder.apply(group2), 7)
|
|
|
+ .putList(listBuilder.apply(group1)) // modified to trip validator
|
|
|
+ .putList(listBuilder.apply(group3), "5", "6")
|
|
|
+ .build())
|
|
|
+ );
|
|
|
+ assertEquals("boom", iae.getMessage());
|
|
|
+ assertEquals(0, results.size());
|
|
|
+ }
|
|
|
+
|
|
|
public void testAddConsumerAffix() {
|
|
|
Setting.AffixSetting<Integer> intSetting = Setting.affixKeySetting("foo.", "bar",
|
|
|
(k) -> Setting.intSetting(k, 1, Property.Dynamic, Property.NodeScope));
|
|
|
@@ -893,7 +987,7 @@ public class ScopedSettingsTests extends ESTestCase {
|
|
|
|
|
|
public void testInternalIndexSettingsSkipValidation() {
|
|
|
final Setting<String> internalIndexSetting = Setting.simpleString("index.internal", Property.InternalIndex, Property.IndexScope);
|
|
|
- final IndexScopedSettings indexScopedSettings =
|
|
|
+ final IndexScopedSettings indexScopedSettings =
|
|
|
new IndexScopedSettings(Settings.EMPTY, Collections.singleton(internalIndexSetting));
|
|
|
// nothing should happen, validation should not throw an exception
|
|
|
final Settings settings = Settings.builder().put("index.internal", "internal").build();
|