|
23 | 23 | import org.elasticsearch.cluster.metadata.IndexMetaData;
|
24 | 24 | import org.elasticsearch.cluster.routing.allocation.decider.FilterAllocationDecider;
|
25 | 25 | import org.elasticsearch.cluster.routing.allocation.decider.ShardsLimitAllocationDecider;
|
| 26 | +import org.elasticsearch.common.collect.Tuple; |
26 | 27 | import org.elasticsearch.common.logging.ESLoggerFactory;
|
27 | 28 | import org.elasticsearch.common.logging.Loggers;
|
28 | 29 | import org.elasticsearch.common.settings.Setting.Property;
|
@@ -180,6 +181,99 @@ public void testDependentSettings() {
|
180 | 181 | service.validate(Settings.builder().put("foo.test.bar", 7).build(), false);
|
181 | 182 | }
|
182 | 183 |
|
| 184 | + public void testTupleAffixUpdateConsumer() { |
| 185 | + String prefix = randomAlphaOfLength(3) + "foo."; |
| 186 | + String intSuffix = randomAlphaOfLength(3); |
| 187 | + String listSuffix = randomAlphaOfLength(4); |
| 188 | + Setting.AffixSetting<Integer> intSetting = Setting.affixKeySetting(prefix, intSuffix, |
| 189 | + (k) -> Setting.intSetting(k, 1, Property.Dynamic, Property.NodeScope)); |
| 190 | + Setting.AffixSetting<List<Integer>> listSetting = Setting.affixKeySetting(prefix, listSuffix, |
| 191 | + (k) -> Setting.listSetting(k, Arrays.asList("1"), Integer::parseInt, Property.Dynamic, Property.NodeScope)); |
| 192 | + AbstractScopedSettings service = new ClusterSettings(Settings.EMPTY,new HashSet<>(Arrays.asList(intSetting, listSetting))); |
| 193 | + Map<String, Tuple<List<Integer>, Integer>> results = new HashMap<>(); |
| 194 | + Function<String, String> listBuilder = g -> (prefix + g + "." + listSuffix); |
| 195 | + Function<String, String> intBuilder = g -> (prefix + g + "." + intSuffix); |
| 196 | + String group1 = randomAlphaOfLength(3); |
| 197 | + String group2 = randomAlphaOfLength(4); |
| 198 | + String group3 = randomAlphaOfLength(5); |
| 199 | + BiConsumer<String, Tuple<List<Integer>, Integer>> listConsumer = results::put; |
| 200 | + |
| 201 | + service.addAffixUpdateConsumer(listSetting, intSetting, listConsumer, (s, k) -> { |
| 202 | + if (k.v1().isEmpty() && k.v2() == 2) { |
| 203 | + throw new IllegalArgumentException("boom"); |
| 204 | + } |
| 205 | + }); |
| 206 | + assertEquals(0, results.size()); |
| 207 | + service.applySettings(Settings.builder() |
| 208 | + .put(intBuilder.apply(group1), 2) |
| 209 | + .put(intBuilder.apply(group2), 7) |
| 210 | + .putList(listBuilder.apply(group1), "16", "17") |
| 211 | + .putList(listBuilder.apply(group2), "18", "19", "20") |
| 212 | + .build()); |
| 213 | + assertEquals(2, results.get(group1).v2().intValue()); |
| 214 | + assertEquals(7, results.get(group2).v2().intValue()); |
| 215 | + assertEquals(Arrays.asList(16, 17), results.get(group1).v1()); |
| 216 | + assertEquals(Arrays.asList(18, 19, 20), results.get(group2).v1()); |
| 217 | + assertEquals(2, results.size()); |
| 218 | + |
| 219 | + results.clear(); |
| 220 | + |
| 221 | + service.applySettings(Settings.builder() |
| 222 | + .put(intBuilder.apply(group1), 2) |
| 223 | + .put(intBuilder.apply(group2), 7) |
| 224 | + .putList(listBuilder.apply(group1), "16", "17") |
| 225 | + .putNull(listBuilder.apply(group2)) // removed |
| 226 | + .build()); |
| 227 | + |
| 228 | + assertNull(group1 + " wasn't changed", results.get(group1)); |
| 229 | + assertEquals(1, results.get(group2).v1().size()); |
| 230 | + assertEquals(Arrays.asList(1), results.get(group2).v1()); |
| 231 | + assertEquals(7, results.get(group2).v2().intValue()); |
| 232 | + assertEquals(1, results.size()); |
| 233 | + results.clear(); |
| 234 | + |
| 235 | + service.applySettings(Settings.builder() |
| 236 | + .put(intBuilder.apply(group1), 2) |
| 237 | + .put(intBuilder.apply(group2), 7) |
| 238 | + .putList(listBuilder.apply(group1), "16", "17") |
| 239 | + .putList(listBuilder.apply(group3), "5", "6") // added |
| 240 | + .build()); |
| 241 | + assertNull(group1 + " wasn't changed", results.get(group1)); |
| 242 | + assertNull(group2 + " wasn't changed", results.get(group2)); |
| 243 | + |
| 244 | + assertEquals(2, results.get(group3).v1().size()); |
| 245 | + assertEquals(Arrays.asList(5, 6), results.get(group3).v1()); |
| 246 | + assertEquals(1, results.get(group3).v2().intValue()); |
| 247 | + assertEquals(1, results.size()); |
| 248 | + results.clear(); |
| 249 | + |
| 250 | + service.applySettings(Settings.builder() |
| 251 | + .put(intBuilder.apply(group1), 4) // modified |
| 252 | + .put(intBuilder.apply(group2), 7) |
| 253 | + .putList(listBuilder.apply(group1), "16", "17") |
| 254 | + .putList(listBuilder.apply(group3), "5", "6") |
| 255 | + .build()); |
| 256 | + assertNull(group2 + " wasn't changed", results.get(group2)); |
| 257 | + assertNull(group3 + " wasn't changed", results.get(group3)); |
| 258 | + |
| 259 | + assertEquals(2, results.get(group1).v1().size()); |
| 260 | + assertEquals(Arrays.asList(16, 17), results.get(group1).v1()); |
| 261 | + assertEquals(4, results.get(group1).v2().intValue()); |
| 262 | + assertEquals(1, results.size()); |
| 263 | + results.clear(); |
| 264 | + |
| 265 | + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> |
| 266 | + service.applySettings(Settings.builder() |
| 267 | + .put(intBuilder.apply(group1), 2) // modified to trip validator |
| 268 | + .put(intBuilder.apply(group2), 7) |
| 269 | + .putList(listBuilder.apply(group1)) // modified to trip validator |
| 270 | + .putList(listBuilder.apply(group3), "5", "6") |
| 271 | + .build()) |
| 272 | + ); |
| 273 | + assertEquals("boom", iae.getMessage()); |
| 274 | + assertEquals(0, results.size()); |
| 275 | + } |
| 276 | + |
183 | 277 | public void testAddConsumerAffix() {
|
184 | 278 | Setting.AffixSetting<Integer> intSetting = Setting.affixKeySetting("foo.", "bar",
|
185 | 279 | (k) -> Setting.intSetting(k, 1, Property.Dynamic, Property.NodeScope));
|
@@ -893,7 +987,7 @@ public void testInternalIndexSettingsFailsValidation() {
|
893 | 987 |
|
894 | 988 | public void testInternalIndexSettingsSkipValidation() {
|
895 | 989 | final Setting<String> internalIndexSetting = Setting.simpleString("index.internal", Property.InternalIndex, Property.IndexScope);
|
896 |
| - final IndexScopedSettings indexScopedSettings = |
| 990 | + final IndexScopedSettings indexScopedSettings = |
897 | 991 | new IndexScopedSettings(Settings.EMPTY, Collections.singleton(internalIndexSetting));
|
898 | 992 | // nothing should happen, validation should not throw an exception
|
899 | 993 | final Settings settings = Settings.builder().put("index.internal", "internal").build();
|
|
0 commit comments