diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AllocationDeciders.java b/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AllocationDeciders.java index 704e9226fb1..551ed870dec 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AllocationDeciders.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AllocationDeciders.java @@ -45,7 +45,7 @@ public class AllocationDeciders extends AllocationDecider { .add(new RebalanceOnlyWhenActiveAllocationDecider(settings)) .add(new ClusterRebalanceAllocationDecider(settings)) .add(new ConcurrentRebalanceAllocationDecider(settings)) - .add(new AwarenessAllocationDecider(settings)) + .add(new AwarenessAllocationDecider(settings, nodeSettingsService)) .build() ); } diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AwarenessAllocationDecider.java b/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AwarenessAllocationDecider.java index 6536c489764..85ad4248ac8 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AwarenessAllocationDecider.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/cluster/routing/allocation/decider/AwarenessAllocationDecider.java @@ -20,6 +20,7 @@ package org.elasticsearch.cluster.routing.allocation.decider; import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.cluster.routing.MutableShardRouting; import org.elasticsearch.cluster.routing.RoutingNode; import org.elasticsearch.cluster.routing.ShardRouting; @@ -28,26 +29,61 @@ import org.elasticsearch.common.collect.Maps; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.trove.map.hash.TObjectIntHashMap; +import org.elasticsearch.node.settings.NodeSettingsService; +import java.util.HashMap; import java.util.Map; /** */ public class AwarenessAllocationDecider extends AllocationDecider { + static { + MetaData.addDynamicSettings( + "cluster.routing.allocation.awareness.attributes", + "cluster.routing.allocation.awareness.force.*" + ); + } + + class ApplySettings implements NodeSettingsService.Listener { + @Override public void onRefreshSettings(Settings settings) { + String[] awarenessAttributes = settings.getAsArray("cluster.routing.allocation.awareness.attributes", null); + if (awarenessAttributes != null) { + logger.info("updating [cluster.routing.allocation.awareness.attributes] from [{}] to [{}]", AwarenessAllocationDecider.this.awarenessAttributes, awarenessAttributes); + AwarenessAllocationDecider.this.awarenessAttributes = awarenessAttributes; + } + Map forcedAwarenessAttributes = new HashMap(AwarenessAllocationDecider.this.forcedAwarenessAttributes); + Map forceGroups = settings.getGroups("cluster.routing.allocation.awareness.force."); + if (!forceGroups.isEmpty()) { + for (Map.Entry entry : forceGroups.entrySet()) { + String[] aValues = entry.getValue().getAsArray("values"); + if (aValues.length > 0) { + forcedAwarenessAttributes.put(entry.getKey(), aValues); + } + } + } + AwarenessAllocationDecider.this.forcedAwarenessAttributes = forcedAwarenessAttributes; + } + } + private String[] awarenessAttributes; private Map forcedAwarenessAttributes; - @Inject public AwarenessAllocationDecider(Settings settings) { + @Inject public AwarenessAllocationDecider(Settings settings, NodeSettingsService nodeSettingsService) { super(settings); this.awarenessAttributes = settings.getAsArray("cluster.routing.allocation.awareness.attributes"); forcedAwarenessAttributes = Maps.newHashMap(); Map forceGroups = settings.getGroups("cluster.routing.allocation.awareness.force."); for (Map.Entry entry : forceGroups.entrySet()) { - forcedAwarenessAttributes.put(entry.getKey(), entry.getValue().getAsArray("values")); + String[] aValues = entry.getValue().getAsArray("values"); + if (aValues.length > 0) { + forcedAwarenessAttributes.put(entry.getKey(), aValues); + } } + + nodeSettingsService.addListener(new ApplySettings()); } public String[] awarenessAttributes() { diff --git a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/cluster/MinimumMasterNodesTests.java b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/cluster/MinimumMasterNodesTests.java index 105faf8856c..873d4a72065 100644 --- a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/cluster/MinimumMasterNodesTests.java +++ b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/cluster/MinimumMasterNodesTests.java @@ -246,7 +246,7 @@ public class MinimumMasterNodesTests extends AbstractZenNodesTests { closeNode(nodeToShutdown); } - Thread.sleep(500); + Thread.sleep(1000); String lastNonMasterNodeUp = nonMasterNodes.removeLast(); logger.info("--> verify that there is no master anymore on remaining nodes"); diff --git a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/embedded/ThreeShardsUnbalancedShardsEmbeddedSearchTests.java b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/embedded/ThreeShardsUnbalancedShardsEmbeddedSearchTests.java index add2c04326e..c1b56d9914f 100644 --- a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/embedded/ThreeShardsUnbalancedShardsEmbeddedSearchTests.java +++ b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/embedded/ThreeShardsUnbalancedShardsEmbeddedSearchTests.java @@ -36,6 +36,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.trove.ExtTIntArrayList; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.node.internal.InternalNode; +import org.elasticsearch.node.settings.NodeSettingsService; import org.elasticsearch.search.Scroll; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; @@ -400,7 +401,7 @@ public class ThreeShardsUnbalancedShardsEmbeddedSearchTests extends AbstractNode public static class UnevenOperationRoutingStrategy extends PlainOperationRouting { @Inject public UnevenOperationRoutingStrategy(Settings settings) { - super(settings, null, new AwarenessAllocationDecider(Builder.EMPTY_SETTINGS)); + super(settings, null, new AwarenessAllocationDecider(Builder.EMPTY_SETTINGS, new NodeSettingsService(Builder.EMPTY_SETTINGS))); } @Override protected int hash(String routing) {