diff --git a/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java b/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java index ce7087bb3d769..4339607860ad7 100644 --- a/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java +++ b/src/main/java/org/elasticsearch/cluster/routing/IndexShardRoutingTable.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.UnmodifiableIterator; import jsr166y.ThreadLocalRandom; +import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.common.collect.MapBuilder; import org.elasticsearch.common.io.stream.StreamInput; @@ -430,22 +431,9 @@ private AttributesRoutings getActiveAttribute(AttributesKey key, DiscoveryNodes if (shardRoutings == null) { synchronized (shardsByAttributeMutex) { ArrayList from = new ArrayList(activeShards); - ArrayList to = new ArrayList(); - for (String attribute : key.attributes) { - String localAttributeValue = nodes.localNode().attributes().get(attribute); - if (localAttributeValue == null) { - continue; - } - for (Iterator iterator = from.iterator(); iterator.hasNext(); ) { - ShardRouting fromShard = iterator.next(); - if (localAttributeValue.equals(nodes.get(fromShard.currentNodeId()).attributes().get(attribute))) { - iterator.remove(); - to.add(fromShard); - } - } - } + ImmutableList to = collectAttributeShards(key, nodes, from); - shardRoutings = new AttributesRoutings(ImmutableList.copyOf(to), ImmutableList.copyOf(from)); + shardRoutings = new AttributesRoutings(to, ImmutableList.copyOf(from)); activeShardsByAttributes = MapBuilder.newMapBuilder(activeShardsByAttributes).put(key, shardRoutings).immutableMap(); } } @@ -457,28 +445,34 @@ private AttributesRoutings getInitializingAttribute(AttributesKey key, Discovery if (shardRoutings == null) { synchronized (shardsByAttributeMutex) { ArrayList from = new ArrayList(allInitializingShards); - ArrayList to = new ArrayList(); - for (String attribute : key.attributes) { - String localAttributeValue = nodes.localNode().attributes().get(attribute); - if (localAttributeValue == null) { - continue; - } - for (Iterator iterator = from.iterator(); iterator.hasNext(); ) { - ShardRouting fromShard = iterator.next(); - if (localAttributeValue.equals(nodes.get(fromShard.currentNodeId()).attributes().get(attribute))) { - iterator.remove(); - to.add(fromShard); - } - } - } - - shardRoutings = new AttributesRoutings(ImmutableList.copyOf(to), ImmutableList.copyOf(from)); + ImmutableList to = collectAttributeShards(key, nodes, from); + shardRoutings = new AttributesRoutings(to, ImmutableList.copyOf(from)); initializingShardsByAttributes = MapBuilder.newMapBuilder(initializingShardsByAttributes).put(key, shardRoutings).immutableMap(); } } return shardRoutings; } + private static ImmutableList collectAttributeShards(AttributesKey key, DiscoveryNodes nodes, ArrayList from) { + final ArrayList to = new ArrayList(); + for (final String attribute : key.attributes) { + final String localAttributeValue = nodes.localNode().attributes().get(attribute); + if (localAttributeValue != null) { + for (Iterator iterator = from.iterator(); iterator.hasNext(); ) { + ShardRouting fromShard = iterator.next(); + final DiscoveryNode discoveryNode = nodes.get(fromShard.currentNodeId()); + if (discoveryNode == null) { + iterator.remove(); // node is not present anymore - ignore shard + } else if (localAttributeValue.equals(discoveryNode.attributes().get(attribute))) { + iterator.remove(); + to.add(fromShard); + } + } + } + } + return ImmutableList.copyOf(to); + } + public ShardIterator preferAttributesActiveInitializingShardsIt(String[] attributes, DiscoveryNodes nodes) { return preferAttributesActiveInitializingShardsIt(attributes, nodes, pickIndex()); }